2008/11/24

應用程式間的通訊 RegisterWindowMessage

本文在說明的主要是針對「應用程式間的通訊」這一需求而來。可參考的文章有:

VC++ Example Capture Print Screen to Clipboard including dropdown menu, SetWindowsHookEx and UnhookWindowsHookEx, with RegisterWindowMessage


RegisterWindowMessage, WM_USER, VC++ MFC Example

RegisterWindowMessage Function
Using Common Dialog Boxes
FINDMSGSTRING Notification

第一個參考資料有 source code,這篇心得主要是針對研究此一 source code 而得。我們先不管整個程式到底在幹嘛,只需要知道訊
息是怎麼傳送的。

首先,在 HScr2Clpbrd_DLL\HScr2Clpbrd_DLL.cpp 有一行:
::PostMessage(hWndReceiver,UWM_ClickPrnScrn,0,0);

可以想像到一件事,我用中文來說,這個 DLL 的功用是:
截取鍵盤事件,若偵測到使用者按 PrintScreen 這個按鍵時,就發出我們註冊的事件:
UWM_ClickPrintScreen_B2ABC742-0A63-49c3-9ACB-CF0068027A66

那麼,是怎麼註冊的?在前面,透過下面這行,要知道的是 UWM_ClickPrnScrn 這個變數意義不大,別被搞混了:
UWM_ClickPrnScrn = ::RegisterWindowMessage
("UWM_ClickPrintScreen_B2ABC742-0A63-49c3-9ACB-CF0068027A66");

好啦,兩行解決發送,那麼接收呢?在上一層 HScr2ClpDlg.cpp 這個主程式中:
也是兩行,一行也是註冊訊息,其實是一模一樣的先註冊:
UWM_ClickPrnScrn = ::RegisterWindowMessage
("UWM_ClickPrintScreen_B2ABC742-0A63-49c3-9ACB-CF0068027A66");

接下來就是接收:
ON_REGISTERED_MESSAGE(UWM_ClickPrnScrn, OnClickPrintScreen)

就這樣子啦,真的是夠簡單了。真正比較重要的是上面那個自訂的訊息,是可以自己定義的字串,重點是別人要知道它的內容是什麼,才有辦法接收到你傳出來的
訊息,而且又要盡量獨特,以免跟其他訊息衝突到:
UWM_ClickPrintScreen_B2ABC742-0A63-49c3-9ACB-CF0068027A66

PS: 這個程式還展示了怎麼截收鍵盤按鍵,是值得學習的
PS2: 微軟有非常多自訂的訊息,其中像 Find & Replace 中用的就是 RegisterWindowMessage

0 意見: