1. 程式人生 > >C#訊息傳值

C#訊息傳值

為了做一個東西,研究了下c#獲取其他控制代碼後進行傳值(才發現幾乎是什麼都不懂就開始做了),屬於windows訊息機制,發現了一些問題,整理如下

一個視窗擁有多個子控制元件,控制代碼不同,所能獲取的訊息和處理也不同,以記事本為例:標題欄控制代碼可接收最大化最小化等訊息,而text控制元件可接收按鍵訊息

在winAPI中有兩種傳遞訊息的方法:SendMessage(int hWnd, int Msg, int wParam, int lParam)和PostMessage(int hWnd, int Msg, int wParam, int lParam),引數型別沒區別,大致區別是:SendMessage在傳送訊息後等待,直到得到相應才返回,PostMessage是直接把訊息加入該控制元件的訊息佇列後即返回。但是,在一個問題上除錯很久發現,SendMessage和PostMessage有很大區別。

以實際情況為例,如果想通過C#控制記事本控制代碼,傳遞字元訊息,則 SendMessage無法處理WM_KEYDOWN\WM_KEYUP訊息,而PostMessage可以響應,暫不知道原因。據推測應該是keydown與keyup在邏輯上有關聯,在控制元件處理keyup訊息之前無法返回keydown的值,造成SendMessage失效(矛盾的是PostMessage只需WM_KEYDOWN即可生效,若新增WM_KEYUP則重複輸出該字元)

如果使用WM_CHAR訊息,SendMessage可以處理,但僅能傳送字元訊息,而如F1~F12,TAB,,CapsLock等按鍵無法響應。

通過Visual Studio的spy++工具可以較好的模擬觀察某窗體的訊息接收及響應過程。

至於系統訊息、使用者訊息、字元訊息等不再羅列,網上很多。