我正在開發一個包含2個部分的應用程序:如何從C#控制檯應用程序關閉在系統托盤中運行的WPF應用程序?
1)從系統托盤運行的WPF應用程序。它有一個GUI窗口,可以通過右鍵單擊sys托盤圖標&在上下文菜單中選擇一個選項,但它不是非常頻繁地需要&應用程序將從系統托盤運行大部分時間。此外,我更改了MainWindow的Closing()事件,以便最小化應用程序,如果用戶試圖關閉它。
2)控制檯應用程序運行時不顯示控制檯&其目的是輪詢其他應用程序的啓動/關閉。只要其他應用程序啓動/關閉,控制檯應用程序也會啓動/關閉WPF應用程序。 (請不要告訴我使用Windows服務來做到這一點,我之前已經探索過這條路線,由於幾個原因我不適合我,我不會在這裏登記)。
問題:我無法從控制檯應用程序中關閉WPF應用程序。我在做什麼如下。首先,我得到處理我的WPF應用程序:
Process AppProcess = Process.GetProcessById((int)AppID);
在此之後,我嘗試了很多的選項,如下所示:
1)殺死進程:AppProcess.Kill();
這是唯一一個工作,但非常不雅。它也會使SysTray圖標不存在,因此不可接受。
2)AppProcess.Close();
完全不起作用&我不知道爲什麼。
3)AppProcess.Dispose();
完全不起作用&我不知道爲什麼。
4)AppProcess.CloseMainWindow();
只有當用戶保持打開WPF應用程序的GUI時纔有效,這很少如我前面提到的那樣。所以,通常這也是行不通的。 (你可能會說我已經破解了Closing()事件以防止關閉窗口,不用擔心我已經採取了適當的謹慎措施來處理這個問題,我提供了其他一些措施來關閉應用程序。決定是否取消關閉操作)
5)將自定義/標準消息傳遞給WPF應用程序的主窗口。
這也適用於WPF應用程序的主窗口(GUI)打開,否則它不會收到消息。
因此,總而言之,沒有任何方法可行。我需要一個可靠的方法從控制檯應用程序中正常關閉WPF應用程序。請提出建議。
我做它目前的方法如下:
在控制檯應用程序:
const uint WM_CUSTOMCLOSE = 0xFE;
IntPtr hWnd = AppProcess.MainWindowHandle;
SendMessage(hWnd, WM_CUSTOMCLOSE, 0, 0);
在WPF應用程序:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if(msg == 0xFE)
{
ExitFlag = true; //Exitflag is checked later to decide whether closing is to be cancelled.
this.Close();
}
return IntPtr.Zero;
}
你的「當前方式」有什麼問題?任何IPC都會(管道,udp,...)。 – JeffRSon
主要問題是什麼? –
問題如上所述:WPF應用程序未關閉。使用我目前的方式,它只會在桌面上出現圖形用戶界面時關閉。但是,如果應用程序正在從系統托盤運行,就像90%的時間,它不會關閉。 – CodeLotus