http://www.chenjiliang.com/Article/View.aspx?ArticleID=4519
SendMessage函數完全使用手冊
首先 我們瞭解一下Windows的訊息機制。Windows是一個訊息驅動式系統,Windows訊息提供應用程式與應用程式之間,應用程式與Windows系統之間進行通訊的手段。
舉個例子,開啟記事本程式,該程式有一個 “檔案“菜單。 那麼,在運行該程式的時候,如果使用者單擊“檔案菜單“裡的“建立“命令,
這個動作將被Windows所捕捉,Windows經過分析得知這個動作應該由我們開啟的記事本程式所來處理,然後Windows就發送個訊息
譬如我們編程的時候有時用到的 WM_COMMAND的訊息給記事本,然後記事本就把這個訊息處理掉。 這個過程就是訊息處理。
接下來,我們把SendMessage的完整形式講一下SendMessage
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
As Long
別名
SendMessageA
說明
調用一個視窗的視窗函數,將一條訊息發給那個視窗。除非訊息處理完畢,否則該函數不會返回
SendMessage所包含4個參數
hwnd 32位的視窗控制代碼視窗可以是任何類型的螢幕對象,因為Win32能夠維護大多數可視對象的控制代碼
wMsg 用於區別其他訊息的常量值,這些常量可以是Windows單元中預定義的常量,也可以是自訂的常量wParam 通常是一個與訊息有關的常量值,也可能是視窗或控制項的控制代碼
lParam 通常是一個指向記憶體中資料的指標。由於WParm、lParam和Pointer都是32位的,因此,它們之間可以相互轉換
wMsg函數
WM_CREATE 建立一個視窗
WM_DESTROY 當一個視窗被破壞時發送
WM_MOVE 移動一個視窗
WM_SIZE 改變一個視窗的大小
WM_ACTIVATE 一個視窗被啟用或失去啟用狀態
WM_SETFOCUS 一個視窗獲得焦點
WM_KILLFOCUS 一個視窗失去焦點
WM_ENABLE 一個視窗改變成Enable狀態
WM_SETREDRAW 設定視窗是否能重畫
WM_SETTEXT 應用程式發送此訊息來設定一個視窗的文本
WM_GETTEXT 應用程式發送此訊息來複製對應視窗的文本到緩衝區
WM_GETTEXTLENGTH 得到與一個視窗有關的文本的長度(不包含Null 字元)
WM_PAINT 要求一個視窗重畫自己
WM_CLOSE 當一個視窗或應用程式要關閉時發送一個訊號
WM_QUERYENDSESSION 當使用者選擇結束對話方塊或程式自己調用ExitWindows函數
WM_QUIT 用來結束程式運行
WM_QUERYOPEN 當使用者視窗恢複以前的大小位置時,把此訊息發送給某個表徵圖
WM_ERASEBKGND 當視窗背景必須被擦除時(例在視窗改變大小時)
WM_SYSCOLORCHANGE 當系統色彩改變時,發送此訊息給所有最上層視窗
WM_ENDSESSION 當系統進程發出 WM_QUERYENDSESSION訊息後,此訊息發送給應用程式,通知它對話是否結束
WM_SHOWWINDOW 當隱藏或顯示視窗是發送此訊息給這個視窗
WM_ACTIVATEAPP 發此訊息給應用程式哪個視窗是啟用的,哪個是非啟用的
WM_FONTCHANGE 當系統的字型資源庫變化時發送此訊息給所有最上層視窗
WM_TIMECHANGE 當系統的時間變化時發送此訊息給所有最上層視窗
WM_CANCELMODE 發送此訊息來取消某種進行中的摸態(操作)
WM_SETCURSOR 如果滑鼠引起游標在某個視窗中移動且滑鼠輸入沒有被捕獲時,就發訊息給某個視窗
WM_MOUSEACTIVATE 當游標在某個非啟用的視窗中而使用者正按著滑鼠的某個鍵發送此訊息給當前視窗
WM_CHILDACTIVATE 發送此訊息給MDI子視窗當使用者點擊此視窗的標題列,或當視窗被啟用,移動,改變大小
WM_QUEUESYNC 此訊息由基於電腦的訓練程式發送,通過WH_JOURNALPALYBACK的hook程式分離出使用者輸入訊息
WM_GETMINMAXINFO 此訊息發送給視窗當它將要改變大小或位置
WM_PAINTICON 發送給已最小化的視窗當它表徵圖將要被重畫
WM_ICONERASEBKGND 此訊息發送給某個已最小化的視窗,僅當它在畫表徵圖前它的背景必須被重畫
WM_NEXTDLGCTL 發送此訊息給一個對話方塊程式去更改焦點位置
WM_SPOOLERSTATUS 每當列印管理列隊增加或減少一條作業時發出此訊息
WM_DRAWITEM 當button,combobox,listbox,menu的可視外觀改變時發送
WM_MEASUREITEM 當button, combo box, list box, list view control, or menu item 被建立時
WM_VKEYTOITEM 此訊息有一個LBS_WANTKEYBOARDINPUT風格的發出給它的所有者來響應WM_KEYDOWN訊息
WM_CHARTOITEM 此訊息由一個LBS_WANTKEYBOARDINPUT風格的列表框發送給他的所有者來響應WM_CHAR訊息
WM_SETFONT 當繪製文本時程式發送此訊息得到控制項要用的顏色
WM_GETFONT 應用程式發送此訊息得到當前控制項繪製文本的字型
WM_SETHOTKEY 應用程式發送此訊息讓一個視窗與一個熱鍵相關連
WM_GETHOTKEY 應用程式發送此訊息來判斷熱鍵與某個視窗是否有關聯
WM_QUERYDRAGICON 此訊息發送給已最小化的視窗,當此視窗將要被拖放而它的類中沒有定義表徵圖,應用程式能返回一個表徵圖或游標的控制代碼,當
使用者拖放表徵圖時系統顯示這個表徵圖或游標
WM_COMPAREITEM 發送此訊息來判
定combobox或listbox新增加的項的相對位置
WM_COMPACTING 顯示記憶體已經很少了
WM_WINDOWPOSCHANGING 發送此訊息給那個視窗的大小和位置將要被改變時,來調用setwindowpos函數或其它視窗管理函數
WM_WINDOWPOSCHANGED 發送此訊息給那個視窗的大小和位置已經被改變時,來調用setwindowpos函數或其它視窗管理函數
WM_POWER 當系統將要進入暫停狀態時發送此
訊息
WM_COPYDATA 當一個應用程式傳遞資料給另一個應用程式時發送此訊息
WM_CANCELJOURNA 當某個使用者取消程式日誌啟用狀態,提交此訊息給程式
WM_NOTIFY 當某個控制項的某個事件已經發生或
這個控制項需要得到一些資訊時,發送此訊息給它的父視窗
WM_INPUTLANGCHANGEREQUEST 當使用者選擇某種輸入語言,或輸入語言的熱鍵改變
WM_INPUTLANGCHANGE 當平台現場已經被改變後發送此訊息給受影響的最最上層視窗
WM_TCARD 當程式已經初始化windows協助例
程時發送此訊息給應用程式
WM_HELP 此訊息顯示使用者按下了F1,如果某
個菜單是啟用的,就發送此訊息個此視窗關聯的菜單,否則就發送給有焦點的視窗,如果當前都沒有焦點,就把此訊息發送給當前啟用的視窗
WM_USERCHANGED 當使用者已經登入或退出後發送此訊息給所有的視窗,當使用者登入或退出時系統更新使用者的具體設定資訊,在使用者更新設定時系統馬上發送此訊息
WM_NOTIFYformAT 公用控制項,自訂控制項和他們的父視窗通過此訊息來判斷控制項是使用ANSI還是UNICODE結構
WM_CONTEXTMENU 當使用者某個視窗中點擊了一下右鍵就發送此訊息給這個視窗
WM_styleCHANGING 當調用SETWINDOWLONG函數將要改變一個或多個 視窗的風格時發送此訊息給那個視窗
WM_styleCHANGED 當調用SETWINDOWLONG函數一個或多個 視窗的風格後發送此訊息給那個視窗
WM_DISPLAYCHANGE 當顯示器的解析度改變後發送此訊息給所有的視窗
WM_GETICON 此訊息發送給某個視窗來返回與某
個視窗有關連的大表徵圖或小表徵圖的控制代碼
WM_SETICON 程式發送此訊息讓一個新的大表徵圖
或小表徵圖與某個視窗關聯
WM_NCCREATE 當某個視窗第一次被建立時,此訊息在WM_CREATE訊息發送前發送
WM_NCDESTROY 此訊息通知某個視窗,非客戶區
正在銷毀
WM_NCCALCSIZE 當某個視窗的用戶端區域必須被核
算時發送此訊息
WM_NCHITTEST 移動滑鼠,按住或釋放滑鼠時發
生
WM_NCPAINT 程式發送此訊息給某個視窗當它
(視窗)的架構必須被繪製時
WM_NCACTIVATE 此訊息發送給某個視窗僅當它的
非客戶區需要被改變來顯示是啟用還是非啟用狀態
WM_GETDLGCODE 發送此訊息給某個與對話方塊程式
關聯的控制項,widdows控制方位鍵和TAB鍵使輸入進入此控制項通過應
WM_NCMOUSEMOVE 當游標在一個視窗的非客戶區內移動時發送此訊息給這個視窗 非客戶區為:表單的標題列及窗 的邊框體
WM_NCLBUTTONDOWN 當游標在一個視窗的非客戶區同步選取滑鼠左鍵時提交此訊息
WM_NCLBUTTONUP 當使用者釋放滑鼠左鍵同時游標某個視窗在非客戶區十發送此訊息
WM_NCLBUTTONDBLCLK 當使用者雙擊滑鼠左鍵同時游標某個視窗在非客戶區十發送此訊息
WM_NCRBUTTONDOWN 當使用者按下滑鼠右鍵同時游標又在視窗的非客戶區時發送此訊息
WM_NCRBUTTONUP 當使用者釋放滑鼠右鍵同時游標又在視窗的非客戶區時發送此訊息
WM_NCRBUTTONDBLCLK 當使用者雙擊滑鼠右鍵同時游標某個視窗在非客戶區十發送此訊息
WM_NCMBUTTONDOWN 當使用者按下滑鼠中鍵同時游標又在視窗的非客戶區時發送此訊息
WM_NCMBUTTONUP 當使用者釋放滑鼠中鍵同時游標又在視窗的非客戶區時發送此訊息
WM_NCMBUTTONDBLCLK 當使用者雙擊滑鼠中鍵同時游標又在視窗的非客戶區時發送此訊息
WM_KEYFIRST WM_KEYDOWN 按下一個鍵
WM_KEYUP 釋放一個鍵
WM_CHAR 按下某鍵,並已發出WM_KEYDOWN, WM_KEYUP訊息
WM_DEADCHAR 當用translatemessage函數翻譯
WM_KEYUP訊息時發送此訊息給擁有焦點的視窗
WM_SYSKEYDOWN 當使用者按住ALT鍵同步選取其它
鍵時提交此訊息給擁有焦點的視窗
WM_SYSKEYUP 當使用者釋放一個鍵同時ALT 鍵
還按著時提交此訊息給擁有焦點的視窗
WM_SYSCHAR 當WM_SYSKEYDOWN訊息
被TRANSLATEMESSAGE函數翻譯後提交此訊息給擁有焦點的視窗
WM_SYSDEADCHAR 當WM_SYSKEYDOWN訊息
被TRANSLATEMESSAGE函數翻譯後發送此訊息給擁有焦點的視窗
WM_INITDIALOG 在一個對話方塊程式被顯示前發
送此訊息給它,通常用此訊息初始化控制項和執行其它任務
WM_COMMAND 當使用者選擇一條功能表命令項或當某個控制項發送一條訊息給它的父視窗,一個快速鍵被翻譯
WM_SYSCOMMAND 當使用者選擇視窗菜單的一條命
令或當使用者選擇最大化或最小化時那個視窗會收到此訊息
WM_TIMER 發生了定時器事件
WM_HSCROLL 當一個視窗標準水平捲軸產生一個滾動事件時發送此訊息給那個視窗,也發送給擁有它的控制項
WM_VSCROLL 當一個視窗標準垂直捲軸產生一個滾動事件時發送此訊息給那個視窗也,發送給擁有它的控制項
WM_INITMENU 當一個菜單將要被啟用時發送此訊息,它發生在使用者菜單條中的某項或按下某個菜單鍵,它允許程式在顯示前更改菜單
WM_INITMENUPOPUP 當一個下拉式功能表或子功能表將要被啟用時發送此訊息,它允許程式在它顯示前更改菜單,而不要改變全部
WM_MENUSELECT 當使用者選擇一條功能表項目時發送
此訊息給菜單的所有者(一般是視窗)
WM_MENUCHAR 當菜單已被啟用使用者按下了某個鍵(不同於加速鍵),發送此訊息給菜單的所有者
WM_ENTERIDLE 當一個模態對話方塊或菜單進入空載狀態時發送此訊息給它的所有者,一個模態對話方塊或菜單進入空載狀態就是在處理完一條或幾條先前的訊息後沒有訊息它的列隊中等待
WM_CTLCOLORMSGBOX 在windows繪製訊息框前發送此訊息給訊息框的所有者視窗,通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定訊息框的文本和背景顏色
WM_CTLCOLOREDIT 當一個編輯型控制項將要被繪製
時發送此訊息給它的父視窗 通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定編輯框的文本和背景顏色
WM_CTLCOLORLISTBOX 當一個列表框控制項將要被繪製前發送此訊息給它的父視窗 通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定列表框的文本和背景顏色
WM_CTLCOLORBTN 當一個按鈕控制項將要被繪製時
發送此訊息給它的父視窗 通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定按紐的文本和背景顏色
WM_CTLCOLORDLG 當一個對話方塊控制項將要被繪製
前發送此訊息給它的父視窗,通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定對話方塊的文本背景顏色
WM_CTLCOLORSCROLLBAR 當一個捲軸控制項將要被繪製時發送此訊息給它的父視窗 通過響應這條訊息,所有者視窗可以通過使用給定的相關顯示裝置的控制代碼來設定捲軸的背景顏色
WM_CTLCOLORSTATIC 當一個靜態控制項將要被繪製時發送此訊息給它的父視窗 通過響應這條訊息,所有者視窗可以 通過使用給定的相關顯示裝置的控制代碼來設定靜態控制項的文本和背景顏色
WM_MOUSEFIRST WM_MOUSEMOVE 移動滑鼠
WM_LBUTTONDOWN 按下滑鼠左鍵
WM_LBUTTONUP 釋放滑鼠左鍵
WM_LBUTTONDBLCLK 雙擊滑鼠左鍵
WM_RBUTTONDOWN 按下滑鼠右鍵
WM_RBUTTONUP 釋放滑鼠右鍵
WM_RBUTTONDBLCLK 雙擊滑鼠右鍵
WM_MBUTTONDOWN 按下滑鼠中鍵
WM_MBUTTONUP 釋放滑鼠中鍵
WM_MBUTTONDBLCLK 雙擊滑鼠中鍵
WM_MOUSEWHEEL 當滑鼠輪子轉動時發送此訊息個當前有焦點的控制項
WM_PARENTNOTIFY 當MDI子視窗被建立或被銷毀
,或使用者按了一下滑鼠鍵而游標在子視窗上時發送此訊息給它的父視窗
WM_ENTERMENULOOP 發送此訊息通知應用程式的
主視窗that已經進入了菜單迴圈模式
WM_EXITMENULOOP 發送此訊息通知應用程式的
主視窗that已退出了菜單迴圈模式
WM_SIZING 當使用者正在調整視窗大小時發送此訊息給視窗 通過此訊息應用程式可以監看式視窗大小和位置也可以修改他們
WM_CAPTURECHANGED 發送此訊息 給視窗當它失
去捕獲的滑鼠時
WM_MOVING 當使用者在移動視窗時發送此訊息,通過此訊息應用程式可以監看式視窗大小和位置也可以修改他們
WM_POWERBROADCAST 此訊息發送給應用程式來通