首先 我們了解一下Windows的消息機制。Windows是一個消息驅動式系統,Windows消息提供應用程序與應用程序之間,應用程序與Windows系統之間進行通信的手段。
舉個例子,打開記事本程序,該程序有一個 「文件「菜單。 那麼,在運行該程序的時候,如果用戶單擊「文件菜單「裡的「新建「命令, 這個動作將被Windows所捕捉,Windows經過分析得知這個動作應該由我們打開的記事本程序所來處理,然後Windows就發送個消息 譬如我們編程的時候有時用到的 WM_COMMAND的消息給記事本,然後記事本就把這個消息處理掉。 這個過程就是消息處理。
SendMessage函數功能:該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列後立即返回。
函數原型 :LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);
參數:
hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。
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 得到與一個窗口有關的文本的長度(不包含空字符)
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 此消息發送給應用程序來通
知它有關電源管理事件 Buttons
BM_CLICK button被點擊 消息 BM_GETCHECK 用於check boxes 或radio boxes 。查看 是否 checked 了。
BM_GETSTATE 發送此消息,可返回 button 的狀態,如 是否被 checked;是否 可用(不可用就 變灰了)
BM_SETCHECK 如果 已經 checked 了,發送此消息後,變為 unchecked,就是 那個鉤鉤 沒被 選上。ok?
BM_SETSTATE 設置 button被 點擊 狀態。
==================== Combo Boxes
CB_ADDSTRING 添加 字符串到 Combo Boxes 。 CB_DELETESTRING 刪除 Combo Boxes 中的 條目,既 item CB_GETCOUNT 得到 Combo Boxes 條目 item 的 數目 CB_GETCURSEL 返回 Combo Boxes 中被選 條目 在 Combo Boxes 中 的位置,第一條為0 。 如果 沒有 條目或出錯,則返回 -1
CB_GETDROPPEDSTATE 發送此消息,可判斷 Combo Boxes 的list box 是否被 放下,如果 是,返回 非零值,不是,則 返回 0
CB_GETLBTEXT 得到 combo box 的 條目 的text。 返回值 是 這個text 的長度。 CB_GETLBTEXTLEN 返回值 是 條目的 text 的長度。 CB_INSERTSTRING 插入 字符串 條目到 combo box 中 CB_RESETCONTENT 清空 combo box 所有條目 CB_SETCURSEL 設置 combo box 被選 條目。 CB_SHOWDROPDOWN 讓 combo box 的listbox 下拉。 既 顯出 所有 條目 =================== Edit Controls
EM_CANUNDO 決定 上一次操作 是否可以 undo (撤消操作)。如果可以,則可發送 EM_undo
EM_GETFIRSTVISIBLELINE 在 multi-line 控件中,找到 最上層的 可見的 行號。次行號是相對於 所有行的。
EM_GETPASSWORDCHAR 返回 密碼框的 字符集。既 是查看密碼。 EM_GETSEL 返回在 可編輯 控件中 ,被選擇(HIGHLIGHT高量選擇)的字符集 的 起點 和終點的 位置。 用 sendmessage 的wParam 參數 返回 起點位置,lParam 返回 終點位置 EM_REPLACESEL 用不同的字符串 替換 可編輯 控件 中的 字符串,如果 可編輯 控件中 沒有 字符串,則 此消息變為 添加 字符串 EM_SETPASSWORDCHAR 在可編輯 控件中 設置 密碼字符集 ,既 用* 代替 EM_UNDO 發送 操作 撤消 消息。 ====================== IP Address Control ===================
IPM_CLEARADDRESS 清除 IP 地址控件(IP Address control)的內容 IPM_GETADDRESS 從IP 地址控件 獲得 存儲在 它中的 IP 地址 信息/ IPM_ISBLANK 決定 IP 地址控件 是否可以為 空值。既 127.0.0.1 之類的地址 為 空。 IPM_SETADDRESS 在 IP 地址控件中設置 IP 地址。 IPM_SETFOCUS 在 IP 地址控件中,當需要輸入 IP 地址時, 使之獲得 鍵盤輸入 焦點 IPM_SETRANGE 設置 輸入IP 地址的有效范圍 ===================== Media Control Interface (MCI) ============================= MM_MCINOTIFY 告訴 窗體 MCI 命令 完成的狀態. 這個 狀態包括 success, failure, 或 其它事件
Menus ============================= WM_COMMAND 當 用戶 選擇 菜單中的 項目後,將向 窗體 發送此消息. 窗體 受到 此消息後,再 決定 下一個 行為
WM_INITMENU 當 菜單 准備 顯示 前,向 窗體發送 此消息, 窗體 將 初始化 菜單 項.
WM_SYSCOMMAND 向 窗體 發送 用戶點擊 系統菜單 消息. 窗體將 響應 這個消息 ,決定 下個 行為. ================ Windows =====================
WM_CLOSE 發送 讓窗體關閉的消息,有些窗體會 在此時 彈出個 關閉對話框。
WM_GETTEXT 返回 窗體 標題欄 (caption 屬性)。 需要先 用WM_GETTEXTLENGTH 獲得 字符串長度
WM_GETTEXTLENGTH 見上!
WM_HELP 發送此 消息後,將 顯示 指定的 HELP 文件 WM_SETTEXT 設置 窗體 標題欄 。 ============================== List Boxes ===============
LB_ADDSTRING 在條目中添加 字符串
LB_DELETESTRING 刪除一個 條目. 條目 序號是從 0 開始的.
LB_GETCOUNT 得到 條目總數.
LB_GETCURSEL 得到 單選 的list box 的 選項條目的 序號
LB_GETSEL 判斷 list 的 條目 是否被選上, 如果 選上了,則返回 >0 的值.否則 返回 0 ,表示 用戶沒選擇條目
LB_GETSELCOUNT 獲得 可多選 的list , 被用戶選擇的條目的個數.
LB_GETSELITEMS 返回 可多選的list 的 被選條目的 序號. 可返回 數組.
LB_GETTEXT 得到 list中的 一個 條目的 text 值 LB_GETTEXTLEN 得到 list中的 一個 條目的 text 值的長度 LB_INSERTSTRING 在list 中,插入 一個條目。如果成功,將返回 插入後,此條目的序號。 LB_RESETCONTENT 清空 所有的 list 中的 條目。 LB_SETCURSEL 對單選 的list box, 設定 用戶 選擇條目的 具體值 LB_SETSEL 對多選 的list box, 設定 用戶 選擇條目的 具體值 ======================================================= Mouse ================== WM_LBUTTONDBLCLK 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標左鍵 已雙擊 。返回值 0
WM_LBUTTONDOWN 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標左鍵 已點擊,返回值 0 WM_LBUTTONUP 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標左鍵 已釋放,返回值 0
WM_MBUTTONDBLCLK 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標中鍵 已雙擊 。返回值 0 WM_MBUTTONDOWN 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標中鍵 已點擊,返回值 0 WM_MBUTTONUP 當鼠標在一個窗體范圍內時,告訴此窗體 鼠標中鍵 已釋放,返回值 0
SendMessage(hWnd,WM_SETFOCUS,0,0); SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001); SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隱藏窗體 SendMessage(HWND, CB_SHOWDROPDOWN, -1, -1) '顯示Combo1.hwnd下拉列表 SendMessage (Combo1.hWnd, CB_SHOWDROPDOWN, 0, 0 ) '不下拉 SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) '關閉 獲得光標位置和字符個數. SendMessage hWnd, WM_KEYDOWN, VK_CONTROL, ByVal 0& ) |
留言列表