2013-06-25 70 views
0

我正在開發一個包含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; 
} 
+0

你的「當前方式」有什麼問題?任何IPC都會(管道,udp,...)。 – JeffRSon

+0

主要問題是什麼? –

+0

問題如上所述:WPF應用程序未關閉。使用我目前的方式,它只會在桌面上出現圖形用戶界面時關閉。但是,如果應用程序正在從系統托盤運行,就像90%的時間,它不會關閉。 – CodeLotus

回答

0

好吧,我發現了一種關閉WPF應用程序。它沒有收到消息的原因是,由於某種原因,當WPF應用程序從系統托盤運行時,AppProcess.MainWindowHandle沒有給出WPF應用程序主窗口的句柄。

因此,我使用在Win32 API中找到的user32.dll:FindWindow()方法來查找WPF應用程序的主窗口。之後,當我將自定義消息傳遞給它時,WPF應用程序正常關閉。

0

使用IPC作爲JeffRSon建議。當兩個進程位於同一臺機器上時,MSMQ是一種非常簡單有效的方法。

定義您的WPF應用程序的一個隊列,當它啓動時,不管是否顯示UI,都讓它監聽隊列。控制檯應用程序可以通過關閉應用程序消息向隊列發送消息。您必須定義數據合同。你可以參考:

http://www.codeproject.com/Articles/3944/Programming-MSMQ-in-NET-Part-1

+0

這似乎是一種很好的方法,但在實現這一點之前,是否有其他方式可以實現這一點,而不需要實現新的功能?即使它不涉及消息傳遞。 – CodeLotus

相關問題