窗口激活-無焦點窗口禁止激活


http://www.cnblogs.com/ywb-lv/articles/2213406.html

窗口激活
當用戶單擊一個非激活的頂級窗體,或非激活的頂級窗體的子窗體時,系統就會發送WM_MOUSEACTIVATE消息(還包括其他消息)給頂級窗體或子窗體,該消息在WM_NCHITTEST消息之后,但在button-down消息之前。當把WM_MOUSEACTIVATE消息交給DefWindowProc函數處理時,系統激活該頂級窗口並投遞button-down消息。
  通過處理WM_MOUSEACTIVATE,一個窗體可以就像鼠標單擊一樣控制激活頂級窗口,並確定該窗體是否接收后續的button-down消息。處理WM_MOUSEACTIVATE后,通過返回以下值實現該目的:
值 含義 
MA_ACTIVATE 激活窗體,但不刪除鼠標消息。 
MA_NOACTIVATE 不激活窗體,也不刪除鼠標消息。 
MA_ACTIVATEANDEAT 激活窗體,刪除鼠標消息。 
MA_NOACTIVATEANDEAT 不激活窗體,但刪除鼠標消息。
 
'相關資料鏈接
'http://topic.csdn.net/t/20020314/11/575275.html
我用鈎子攔截了WH_CALLWNDPROC,發現在鼠標點擊切換窗口的過程中,是原窗口先收到WM_ACTIVATE消息(wParam指示失活),再收到WM_ACTIVATEAPP消息(wParam指示失活),再收到WM_KILLFOCUS消息,然后才是新窗口收到WM_MOUSEACTIVATE消息,如果新窗口對這個消息返回MA_NOACTIVATE或MA_NOACTIVATEANDEAT,則不再有其它消息;如果新窗口對WM_MOUSEACTIVATE消息的處理返回MA_ACTIVATE,則接下來新窗口還收到WM_ACTIVATEAPP消息(wParam指示激活),然后是WM_ACTIVATE消息(wParam指示鼠標激活),然后是WM_SETFOCUS消息。 
由此看來,在新窗口處理WM_MOUSEACTIVATE消息之前,舊窗口已經處理了WM_KILLFOCUS消息將焦點丟棄,所以對WM_MOUSEACTIVATE返回MA_NOACTIVATEANDEAT,新窗口就不會收到WM_SETFOCUS因而就將使沒有窗口擁有焦點了。
'相關資料鏈接  2
在windows的窗口系統中,popup窗口的焦點是與它的活動狀態密切相關的。只要使 
popup窗口不獲得活動狀態,popup窗口就不會自動獲得焦點。具體方法如下: 
1. 在創建popup窗口時不要有WS_VISIBLE風格,然后調用SetWindowPos函數顯示 
創建的窗口,參數uFlag取值SWP_SHOWWINDOW and SWP_NOACTIVATE,這樣就可以保證 
窗口在創建是不會得到活動狀態,也就不會獲得焦點。 
2. 響應WM_MOUSEACTIVATE消息,返回MA_NOACTIVATE表示窗口在鼠標點擊時不需要 
獲得活動狀態,這樣就可以保證在鼠標點擊時窗口不會自動獲得焦點。 
至於鼠標輸入的響應,本就與窗口是否獲得焦點無關,不會受到影響。  
'相關資料鏈接 3
   一個窗口我在WM_MOUSEACTIVATE消息中這么處理
int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
return MA_NOACTIVATE;
}
這樣是正常的,點擊到它的client區域沒問題,它不會獲得焦點。
如果它包含一個按鈕,那么點擊按鈕,這個窗口還是獲得焦點了。
用spy++看,它走了WM_MOUSEACTIVATE消息並返回MA_NOACTIVATE以后緊接着就WM_ACTIVE了。
用spy++跟蹤那個按鈕,也走了WM_MOUSEACTIVATE並且返回MA_NOACTIVATE。
1.按鈕如何響應WM_MOUSEACTIVATE的?
2.點了按鈕以后這個窗口為什么還會獲得焦點?
3.它獲得焦點的整個過程(消息的收發)是怎樣的? 
 
 MA_NOACTIVATEANDEAT以后,是不會獲得焦點了,但是按鈕也不響應點擊了。
如果我希望按鈕既可以響應點擊事件而且窗口也不會獲得焦點要如何做? 
 
'個人總結
在原來窗口使用WM_NCACTIVATE消息當 wParam = 0 時  ,返回wParam = 1 ,那么原窗口就不會失去焦點,然后新窗口使用子類來處理消息也是可以的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM