2010-09-25 2 views
12

Я сделав загрузчик изображений (загрузить изображение на хостинг изображений сайта) и у меня возникают некоторые проблемы, передавая аргумент (расположение изображения к уже запущенному приложению)передать аргументы запущенного приложения

  • Прежде всего допустим, MyApp.exe всегда работает
  • Когда бы я не щелкнул правой кнопкой мыши по изображению, я добавил элемент в контекстном меню Windows по умолчанию, в котором говорится «Загрузить изображение».
  • Когда это нажало, ему необходимо передать местоположение уже запущенному приложению.

Мои Program.cs:

static class Program 
{ 
    [DllImport("user32.dll")] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

    [DllImport("user32.dll")] 
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr 
    wParam, IntPtr lParam); 

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern uint RegisterWindowMessage(string lpString); 

    [STAThread] 
    static void Main(params string[] Arguments) 
    { 
     if (Arguments.Length > 0) 
     { 
    //This means that the the upload item in the context menu is clicked 
    //Here the method "uploadImage(string location)" 
    //of the running application must be ran 
     } 
     else 
     { 
    //just start the application 
      Application.Run(new ControlPanel()); 
     } 
    } 
} 

Обратите внимание, что класс ControlPanel не имеет видимую форму, только иконка в трее присутствует, так как форма не требуется.

Могу ли я получить помощь по тому, как это сделать?

ответ

13

Я понял это, так что огромное спасибо за человека, который разместил ссылку http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a5bcfc8a-bf69-4bbc-923d-f30f9ecf5f64, это именно то, что я искал!

Вот полное решение:

static class Program 
{ 
    [STAThread] 
    static void Main(params string[] Arguments) 
    { 
     SingleInstanceApplication.Run(new ControlPanel(), NewInstanceHandler); 
    } 

    public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e) 
    { 
     string imageLocation = e.CommandLine[1]; 
     MessageBox.Show(imageLocation); 
     e.BringToForeground = false; 
     ControlPanel.uploadImage(imageLocation); 
    } 

    public class SingleInstanceApplication : WindowsFormsApplicationBase 
    { 
     private SingleInstanceApplication() 
     { 
      base.IsSingleInstance = true; 
     } 

     public static void Run(Form f, StartupNextInstanceEventHandler startupHandler) 
     { 
      SingleInstanceApplication app = new SingleInstanceApplication(); 
      app.MainForm = f; 
      app.StartupNextInstance += startupHandler; 
      app.Run(Environment.GetCommandLineArgs()); 
     } 
    } 
} 

Большое спасибо всем, и особенно тот, кто разместил эту ссылку, я уже упоминал выше, но я предполагаю, что он удалил свой ответ?

С уважением, Kenny

+0

Кенни, спасибо за сообщение. Это мне очень помогло. Есть ли способ ссылки на форму (ваш ControlPanel) в методе NewInstanceHandler? Я знаю, что вы ссылаетесь на метод uploadImage в ControlPanel, но это статический метод. Но мне нужно ссылаться на нестатические методы. Pls дайте мне знать – Dave

2

Предполагая, что вы контролируете среду исполнения, приложение-слушатель может просто выставить конечную точку с использованием WCF или даже сырого TCP-сокета. Таким образом, любое другое приложение может подключаться к нему динамическим, но структурированным способом.

Несмотря на то, что отправитель и получатель находятся на одной машине, использование сетевого транспортного решения (например, WCF или TCP) - отличный способ безопасно отправлять данные через процессы.

Вот пример того, как сделать это в TCP с C#: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

WCF может быть немного сложнее (частично из-за его гибкость, а также из-за ограничений сериализации), но есть много документации онлайн о том, как его использовать. WCF - это более объектно-ориентированное решение, потому что могут генерироваться классы-прокси, которые позволяют делать строго типизированные вызовы фактическим объектам, а не просто отправлять сообщения.

4

Ну, вам нужно будет установить канал связи для других приложений, чтобы отправлять изображения. Этот канал связи может быть одним из следующих - не полный список только образцов:

  • Каталог, который просматривается вашим приложением и файлом, добавляется после его добавления в каталог.
  • Порт, куда могут отправлять другие приложения.
  • Самостоятельный веб-сервис, который принимает изображения.
  • Порт TCP, который получает изображения.
  • Именованная труба.
  • ....

Как вы видите, есть несколько возможностей. Правильный для вас зависит от вашего сценария. Файловая система - это опция, которая может быть легко реализована с использованием FileSystemWatcher для образца see here.

Самостоятельная веб-служба предоставляет веб-службу, которая может получать изображения. See here для образца.

ИМХО, это два варианта, которые являются самыми легкими. Но ... есть еще несколько.

Для порта TCP см. Сообщение Тима.

+1

+1 для предложения FileSystemWatcher. Я использовал наблюдателя во многих приложениях с отличными результатами. Я бы не использовал один, если требуется синхронное общение или требуется отношение запрос/ответ, но это не похоже на требования. –

+0

Привет, спасибо, что дал мне дополнительные идеи, но вы должны знать, что я не контролирую сайт хостинга изображений. Я просто загружаю изображение, выполняя отправку POST и получая ответ (который содержит ссылку загруженного изображения в Интернете) Я пробовал идею TCP, но по какой-то причине я не думаю, что это то, что мне нужно. У меня есть полностью работающее приложение, которое загружает изображения и т. Д. Единственное, что мне нужно сейчас: – Kenny

0

Я добавил некоторые небольшие дополнения к предыдущему решению ссылаться сеттер на форме, чтобы передать аргументы к нему.

Прежде всего, создайте статическую ссылку на исходный экземпляр формы (MainForm).

Затем при последующей отправке аргументов NewInstanceHandler может использовать сохраненную ссылку в форме для доступа к ее общедоступным методам/свойствам (в моем случае, сеттер под названием AddItem).

Простым способом проверки этого является добавление публичного свойства в форму с помощью установщика для изменения текстового свойства формы (текст заголовка).

[STAThread] 
    static Form1 MainForm; 

    static void Main(params string[] Arguments) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     MainForm = new Form1(); 
     SingleInstanceApplication.Run(MainForm, NewInstanceHandler); 
    } 

    public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e) 
    { 
     MainForm.AddItem = e.CommandLine[1]; 
     e.BringToForeground = false; 
    } 

    public class SingleInstanceApplication : WindowsFormsApplicationBase 
    { 
     private SingleInstanceApplication() 
     { 
      base.IsSingleInstance = true; 
     } 

     public static void Run(Form f, StartupNextInstanceEventHandler startupHandler) 
     { 
      SingleInstanceApplication app = new SingleInstanceApplication(); 
      app.MainForm = f; 
      app.StartupNextInstance += startupHandler; 
      app.Run(Environment.GetCommandLineArgs()); 
     } 
    } 
+0

Имя «MainForm» не существует в текущем контексте что не так ??? – ACE

0

Чтобы избежать запуска второго экземпляра после передачи аргументов командной строки существующему экземпляру, я добавил ниже фрагмент кода.

+0

Имя «MainForm» не существует в текущем контексте что не так ??? – ACE

Смежные вопросы