Вызов метода другого потока или как сделать "Открыть через." - C#
Формулировка задачи:
Здравствуйте. Хочу сделать приложение со своим пунктом в контекстом меню Windows. Например "Открыть с помощью %название программы%". Попытался воспроизвести поведение текстовых редакторов, на примере sublimetext. Вставил ручками в реестр свой пункт меню, написал к нему такую же shell команду, которая по факту просто путь до exe файла + параметр "%1" передающий путь до файла. И создал простенькую форму, с 1 полем в котором отображается переданный параметр с путем до файла. Отображение идет через вызов простого метода с одним строчным параметром.
Нормальное поведение текстового редактора: при каждом вызове контекстного меню он в экземпляре своей первой запущенной программы создает еще один таб с редактируемым файлом.
Ненормальное поведение моей программы: при каждом вызове контекстного меню создается новый экземпляр программы и в каждом переданный параметр.
Пытался найти решение , накопал Windows Shell Extensions. Но он доступен с NET 4.0.
Отсюда вопрос, как это делалось до 4.0 ? Как при каждом вызове exe файла , передавать параметры уже существующему экземпляру программы ?
Все попытки найти инфу упирались в WCF. Можно как то проще вызвать метод на потоке другого процесса, учитывая что это тот же самый exe файл ? Или как то можно вызвать метод на полученном объекте Process (хотя по имени метода, он его не находит)?
Решение задачи: «Вызов метода другого потока или как сделать "Открыть через."»
textual
Листинг программы
class Program { [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); const uint WM_SETTEXT = 0x000C; [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam); static void Main(string[] args) { // Ищем главное окно процесса по его имени. Process[] processes = Process.GetProcessesByName("WindowsFormsApplication1"); if (processes.Length == 0) { Console.WriteLine("Процесс не найден. Завершение работы."); return; } IntPtr handle = processes[0].MainWindowHandle; // Также окно можно искать по его классу и заголовку // Класс окна и его дочерних элементов можно узнавать с помощью Spy++ // (VisualStudio -> Tools -> Spy++) // Наверняка они будут различаться для различных версий .NET. // IntPtr handle = FindWindow("WindowsForms10.Window.8.app.0.141b42a_r14_ad1", "Form1"); // Будем искать TextBox, обрабатывающий наши сообщения, // по задаваемому нами вручную уникальному заголовку (тексту). // В данном случае это сгенерированный GUID. const string uniqueCaption = "{5DEF1E05-EC29-4505-B87A-F7F48DCB75A0}"; IntPtr hwndTextBox = FindWindowEx(handle, IntPtr.Zero, "WindowsForms10.EDIT.app.0.141b42a_r14_ad1", uniqueCaption); if (hwndTextBox != IntPtr.Zero) { SendMessage(hwndTextBox, WM_SETTEXT, IntPtr.Zero, "Some text"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д