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++工具可以較好的模擬觀察某窗體的訊息接收及響應過程。
至於系統訊息、使用者訊息、字元訊息等不再羅列,網上很多。