2011-02-28 106 views
0

有什麼辦法可以防止窗口被停用?窗戶是在不同的過程,然後我的。如何防止窗口被禁用?

這是用於Windows的。

+3

來回答這些問題的關鍵是:如果兩個應用程序試圖做到這一點? – 2011-02-28 13:23:59

+0

@Sasha:+1。此外,「窗戶處於不同的過程」聽起來像是對基本問題的有趣轉折。 – 2011-02-28 13:28:25

+4

「阻止不同進程的窗口被停用」聽起來像是你想要做的工作,而不是問題 - 如果你能告訴我們底層問題是什麼,你可能會得到更好的建議。 – 2011-02-28 13:43:05

回答

3

這樣做可能很危險,但解決方案是處理WM_ACTIVATE消息並檢查wParam是否爲WA_INACTIVE。這意味着該窗口已被禁用。發生這種情況時,您可以重新激活它。

爲了對另一個進程的窗口執行此操作,您需要安裝一個帶有SetWindowsHookEx的消息鉤子。

但是,另一個應用程序可能會做同樣的事情,使對方處於無限循環的激活/停用狀態。

這也是絕對不應該由個人計算機上運行的軟件來完成的。

+2

更重要的是,在改變焦點的事件中,你不應該改變焦點,這在Windows中是一個硬性規則。 'WM_ACTIVATE'僅僅是一個窗口正在改變激活狀態的通知:**它不要求許可**。你在這件事上沒有任何發言權,而且假設你只是在尋求麻煩。 – 2011-02-28 13:46:56

0

您可以捕獲WM_ACTIVATEAPP這樣的:

protected override void WndProc(ref Message m) { 
    // Trap WM_ACTIVATEAPP 
    if ((m.Msg == 0x1c) && (m.WParam == IntPtr.Zero)) 
    { 
    // If WM_ACTIVATEAPP and WParam is deactivated, return 
    return; 
    } 
    base.WndProc(ref m); 
} 
+0

這個問題在不同的過程中需要一個窗口。您的代碼只能用於同一過程中的窗口(與代碼相同)。 – Steve 2011-02-28 13:49:39

+0

你確定這可以嗎?另一個應用程序同時收到一個「WM_ACTIVATEAPP」消息。此消息不會要求停用應用程序的權限。 – 2011-02-28 13:49:48