У меня есть приложение без окон WPF, использующее NotifyIcon от Филиппа Суми. Я с удовольствием заменяю свою старую версию для WinForms, однако у меня есть одна проблема.
У моего приложения есть деинсталлятор, который закрывает приложение в трее перед удалением исполняемых файлов. Закрытие делается с помощью отправки сообщения WM_CLOSE в процесс приложения в трее. Однако относительно легко прослушивать такие сообщения с помощью WinForms - как это сделать с WPF, и, опять же, может быть, есть лучший способ удаленного оповещения моего приложения WPF о завершении работы в трее? Я имею в виду, что еще там? Трубы?
ЭТО НЕ ДУБЛИКАТ. В моем приложении нет «главного окна». Так что ничего, ссылающегося на главные окна, работать не будет.
Я полагаю, что система должна иметь способ сказать приложению, чтобы оно закрывало себя, в случае, скажем, перезагрузки или выключения. Вот почему мы получаем «это, а это приложение не отвечает, хотите ли вы выключить его в любом случае» или подобные сообщения.
Вот мой наивный подход:
using (var process = Process.GetProcessesByName("MyApp").FirstOrDefault()) {
const uint WM_SYSCOMMAND = 0x0112;
const uint SC_CLOSE = 0xF060;
const uint WM_CLOSE = 0x0010;
var hwnd = process.MainWindowHandle;
NativeMethods.SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
foreach (ProcessThread thread in process.Threads) {
NativeMethods.PostThreadMessage(
(uint)thread.Id,
WM_SYSCOMMAND,
(IntPtr)SC_CLOSE,
IntPtr.Zero
);
}
}
Не работает. Конечно, hwnd всегда IntPtr.Zero, если я не создаю окно, очевидно, я не хочу создавать окно. Потоки приложения игнорируют SC_CLOSE, поэтому здесь тоже нет радости.
ОК, я пытался создать невидимое окно. Этот подход работает, если в окне ShowInTaskBar установлено значение true. Не хорошо.
Затем я создал губчатое окно из System.Windows.Forms.NativeWindow.
Конечно, это невидимое окно вполне способно принимать WM_CLOSE и любые другие сообщения, однако ононе установлено в качестве основного окна процесса, поэтому я не могу настроить его для своего приложения удаления.
В настоящее время у меня нет идей.