2008-10-23 23 views
0

我正在將另一個應用程序的窗口放在最頂層,以確保在我的應用程序中的點擊將另一個應用程序的對話框帶入視圖。我遇到的問題是在通話結束後,我沒有將注意力集中回到我的應用程序。如果其他應用程序有更多的窗口,其中一個應用程序以焦點結束,否則沒有窗口(僅查看任務欄)會獲得焦點。我應該從哪裏開始調查這個問題?將另一個應用程序的窗口置頂後重點丟失

我製作的其他應用程序最上面的代碼是:

Process p = Process.GetProcessById(trackedProcessID); 
IntPtr h = p.MainWindowHandle; 
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS; 
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 

與常量

public static readonly uint SWP_NOMOVE = 0x0002; 
public static readonly uint SWP_NOSIZE = 0x0001; 
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000; 
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 

回答

2

相關:Unexpected behaviour of Process.MainWindowHandle

基本上MainWindowHandle讓你的當前最頂層窗口儘管文件說了什麼。

這就解釋了爲什麼其他流程的主窗口不一定會獲得關注。

你的其他問題是因爲你沒有把它放回你的應用程序後重點。

其實,你正在做的正確的名詞是建立z-order

而不是試圖控制z順序 - 這不能保證 - 你可能會更好地發送消息到其他進程。

+0

非常有趣!但即使我的第二個應用程序只有一個可見的窗口(再次,從任務欄,這可能不是一個好的來源),我會期望一旦其他應用程序中的對話框關閉我的焦點回來。要麼? – Oskar 2008-10-23 16:16:31

+0

不,不一定,您需要將焦點(實際上這裏的術語是正確的z順序)返回給您的應用程序。 – 2008-10-23 16:18:27

2

您是否嘗試過SWP_NOACTIVATE?

0

[實際解決方案中使用]

到目前爲止,我與發送調用窗口的窗口句柄到目標應用程序,並得到完成它時將其推回頂上去。這是一個真正的痛苦,因爲我將有50個窗口來處理,但它看起來很穩定。接下來的方法,如果事實證明存在問題,將回調到調用應用程序,並要求它將窗口推到前臺,但我寧願不這樣做,因爲它引入了一種可能性,即用戶可以做些事情在消息傳輸時調用應用程序(如果在相同的傳輸協議中有很多消息進入,那麼這只是一個問題,很可能會發生)

不要嘗試使用傳入窗口句柄並設置父項在目標應用程序中顯示的任何窗口中,它只會使顯示的對話框出現在調用應用程序窗口的邊界內,並在必要時裁剪 - 無用

非常感謝以上問題的答案

相關問題