日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息

發布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了與Win32 GUI的函數功能兼容,得先知道Windows是怎么處理這些信息的,才能模仿。

這次研究對象是SetActiveWindow與SetFocus和窗口消息WM_SETFOCUS,WM_ACTIVATE之間的關系

------------------------------------

SetFocus

功能:設置新的焦點窗口,只有焦點窗口才能獲取鍵盤輸入消息

1.這個函數會檢查輸入的窗口,如果是最小化的窗口,或者禁用的窗口,則不會改變焦點.

2.如果要設置的焦點窗口是子窗口,且其父窗口不是激活狀態,還會調用SetActiveWindow將其父窗口激活.

3.檢查激活窗口是否成功,如果沒有成功,則取消設置新焦點.

4.向窗口發送WM_SETFOCUS消息,向前一個焦點窗口發送WM_KILLFOCUS消息

-----------------------------------

SetActiveWindow

功能:設置激活窗口,只有激活窗口,才能擁有焦點窗口

1.檢查傳入的窗口,如果是子窗口,則取消操作

2.向當前激活窗口發送WM_NCACTIVE消息,如果當前激活窗口返回FALSE,則表示它不同意其它窗口被激活,所以取消操作.

3.如果第2步沒有問題,則向當前激活窗口發送WM_ACTIVE消息,告之被取消激活.

4.將傳入的窗口標記為激活窗口,并將窗口的Z序置頂,

5.向新激活窗口發送WM_NCACTIVE和WM_ACTIVE消息,告之被成功激活.


---------------------------------

WM_NCACTIVE

這個消息通知窗口,非客戶區被激活或取消激活.

當WPARAM參數為FALSE時,表示窗口要被取消激活,此時如果返回FALSE,則會阻止被取消激活,返回TRUE則表示允許被激活。

DefWindowProc 處理方式:做一些內部標記,如果lParam為-1的話,還要重繪標題欄和菜單欄!


WM_SETFOCUS?

這個消息是通知窗口,即將獲得或失去焦點;

DefWindowProc好像并沒有處理這個消息。


WM_ACTIVATE?

?這個消息是通知窗口,即將被激活或取消激活;

DefWindowProc 處理方式是:如果這個窗口馬上要被激活了,則將這個窗口設置為焦點窗口


---------------------------------

這里很詭異的是,如果對一個未激活的主窗口調用SetFocus,它會激活這個窗口,

而激活這個窗口會發送WM_ACTIVE消息,而默認處理WM_ACTIVE消息的方式又是對這個窗口調用SetFocus...


總結

以上是生活随笔為你收集整理的研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。