SendMessage函數完全使用手冊 (解讀WM_)

SendMessage函數完全使用手冊

原文:http://blog.itpub.net/79126/viewspace-981421/

    首先 我們瞭解一下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
說明
調用一個窗口的窗口函數,將一條消息發給那個窗口。除非消息處理完畢,否則該函數不會返回


以下摘自MSDN:

SendMessage

The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function. To post a message to a thread's message queue and return immediately, use the PostMessage or PostThreadMessage function.

LRESULT SendMessage(
  HWND hWnd,      // handle to destination window
  UINT Msg,       // message
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

Parameters

hWnd
[in] Handle to the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
Msg
[in] Specifies the message to be sent.
wParam
[in] Specifies additional message-specific information.
lParam
[in] Specifies additional message-specific information.

Return Values

The return value specifies the result of the message processing; it depends on the message sent. 


SendMessage


hwnd : 32位的窗口句柄窗口可以是任何類型的屏幕對象,因爲Win32能夠維護大多數可視對象的句柄
wMsg :用於區別其他消息的常量值,這些常量可以是Windows單元中預定義的常量,也可以是自定義的常量

wParam: 通常是一個與消息有關的常量值,也可能是窗口或控件的句柄
lParam :通常是一個指向內存中數據的指針。

由於WParm、lParam和Pointer都是32位的,因此,它們之間可以相互轉換


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 得到與一個窗口有關的文本的長度(不包含空字符)
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 此消息發送給應用程序來通
知它有關電源管理事件 
WM_DEVICECHANGE 當設備的硬件配置改變時

發送此消息給應用程序或設備驅動程序
WM_MDIDESTROY 應用程序發送此消息給多文
檔的客戶窗口來關閉一個MDI 子窗口
WM_MDIACTIVATE 應用程序發送此消息給多文

檔的客戶窗口通知客戶窗口激活另一個MDI子窗口,當客戶窗口收到此消息後,它發出WM_MDIACTIVE消息給MDI子窗口(未激活)激活它 
WM_MDIRESTORE 程序 發送此消息給MDI客戶
窗口讓子窗口從最大最小化恢復到原來大小
WM_MDINEXT 程序 發送此消息給MDI客戶
窗口激活下一個或前一個窗口
WM_MDIMAXIMIZE 程序發送此消息給MDI客戶
窗口來最大化一個MDI子窗口 
WM_MDITILE 程序 發送此消息給MDI客戶
窗口以平鋪方式重新排列所有MDI子窗口
WM_MDICASCADE 程序 發送此消息給MDI客戶
窗口以層疊方式重新排列所有MDI子窗口
WM_MDIICONARRANGE 程序 發送此消息給MDI客戶窗口重新排列所有最小化的MDI子窗口
WM_MDIGETACTIVE 程序 發送此消息給MDI客戶
窗口來找到激活的子窗口的句柄
WM_MDISETMENU 程序 發送此消息給MDI客戶
窗口用MDI菜單代替子窗口的菜單
WM_CUT 程序發送此消息給一個編輯框或combobox來刪除當前選擇的文本
WM_COPY 程序發送此消息給一個編輯框或combobox來複制當前選擇的文本到剪貼板
WM_PASTE 程序發送此消息

給editcontrol或combobox從剪貼板中得到數據
WM_CLEAR 程序發送此消息

給editcontrol或combobox清除當前選擇的內容 
WM_UNDO 程序發送此消息給editcontrol或combobox撤消最後一次操作
WM_DESTROYCLIPBOARD 當調用ENPTYCLIPBOARD函數時 發送此消息給剪貼板的所有者
WM_DRAWCLIPBOARD 當剪貼板的內容變化時發

送此消息給剪貼板觀察鏈的第一個窗口 它允許用剪貼板觀察窗口來顯示剪貼板的新內容
WM_PAINTCLIPBOARD 當剪貼板包含CF_OWNERDIPLAY格式的數據並且剪貼板觀察窗口的客戶區需要重畫 
WM_SIZECLIPBOARD 當剪貼板包含CF_OWNERDIPLAY格式的數據並且剪貼板觀察窗口的客戶區域的大小已經改變是
此消息通過剪貼板觀察窗口發送給剪貼板的所有者 
WM_ASKCBformATNAME 通過剪貼板觀察窗口發送
此消息給剪貼板的所有者來請求一個CF_OWNERDISPLAY格式的剪貼板的名字
WM_CHANGECBCHAIN 當一個窗口從剪貼板觀察
鏈中移去時發送此消息給剪貼板觀察鏈的第一個窗口 
WM_HSCROLLCLIPBOARD 此消息通過一個剪貼板觀察窗口發送給剪貼板的所有者 它發生在當剪貼板包含CFOWNERDISPALY格式的數據並且有個事件在剪貼板觀察窗的水平滾動條上 所有者應滾動剪貼板圖象並更新滾動條的值 
WM_QUERYNEWPALETTE 此消息發送給將要收到焦
點的窗口,此消息能使窗口在收到焦點時同時有機會實現他的邏輯調色板
WM_PALETTEISCHANGING 當一個應用程序正要實現它的邏輯調色板時發此消息通知所有的應用程序
WM_PALETTECHANGED 此消息在一個擁有焦點的
窗口實現它的邏輯調色板後發送此消息給所有頂級並重疊的窗口,以此來改變系統調色板 
WM_HOTKEY 當用戶按下由REGISTERHOTKEY函數註冊的熱鍵時提交此消息
WM_PRINT 應用程序發送此消息僅當

WINDOWS或其它應用程序發出一個請求要求繪製一個應用程序的一部分










發佈了47 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章