Вызов метода другого потока или как сделать "Открыть через." - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Хочу сделать приложение со своим пунктом в контекстом меню Windows. Например "Открыть с помощью %название программы%". Попытался воспроизвести поведение текстовых редакторов, на примере sublimetext. Вставил ручками в реестр свой пункт меню, написал к нему такую же shell команду, которая по факту просто путь до exe файла + параметр "%1" передающий путь до файла. И создал простенькую форму, с 1 полем в котором отображается переданный параметр с путем до файла. Отображение идет через вызов простого метода с одним строчным параметром. Нормальное поведение текстового редактора: при каждом вызове контекстного меню он в экземпляре своей первой запущенной программы создает еще один таб с редактируемым файлом. Ненормальное поведение моей программы: при каждом вызове контекстного меню создается новый экземпляр программы и в каждом переданный параметр. Пытался найти решение , накопал Windows Shell Extensions. Но он доступен с NET 4.0. Отсюда вопрос, как это делалось до 4.0 ? Как при каждом вызове exe файла , передавать параметры уже существующему экземпляру программы ? Все попытки найти инфу упирались в WCF. Можно как то проще вызвать метод на потоке другого процесса, учитывая что это тот же самый exe файл ? Или как то можно вызвать метод на полученном объекте Process (хотя по имени метода, он его не находит)?

Решение задачи: «Вызов метода другого потока или как сделать "Открыть через."»

textual
Листинг программы
  1. class Program
  2.     {
  3.         [DllImport("user32.dll", SetLastError = true)]
  4.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  5.  
  6.         [DllImport("user32.dll", SetLastError = true)]
  7.         static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
  8.  
  9.         const uint WM_SETTEXT = 0x000C;
  10.  
  11.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  12.         static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
  13.  
  14.  
  15.         static void Main(string[] args)
  16.         {
  17.             // Ищем главное окно процесса по его имени.
  18.             Process[] processes = Process.GetProcessesByName("WindowsFormsApplication1");
  19.             if (processes.Length == 0)
  20.             {
  21.                 Console.WriteLine("Процесс не найден. Завершение работы.");
  22.                 return;
  23.             }
  24.             IntPtr handle = processes[0].MainWindowHandle;
  25.  
  26.             // Также окно можно искать по его классу и заголовку
  27.             // Класс окна и его дочерних элементов можно узнавать с помощью Spy++
  28.             // (VisualStudio -> Tools -> Spy++)
  29.             // Наверняка они будут различаться для различных версий .NET.
  30.             // IntPtr handle = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r14_ad1", "Form1");
  31.  
  32.             // Будем искать TextBox, обрабатывающий наши сообщения,
  33.             // по задаваемому нами вручную уникальному заголовку (тексту).
  34.             // В данном случае это сгенерированный GUID.
  35.             const string uniqueCaption = "{5DEF1E05-EC29-4505-B87A-F7F48DCB75A0}";
  36.             IntPtr hwndTextBox = FindWindowEx(handle, IntPtr.Zero,
  37.                 "WindowsForms10.EDIT.app.0.141b42a_r14_ad1", uniqueCaption);
  38.             if (hwndTextBox != IntPtr.Zero)
  39.             {
  40.                 SendMessage(hwndTextBox, WM_SETTEXT, IntPtr.Zero, "Some text");
  41.             }
  42.         }
  43.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы