




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、SendMessage函數(shù)完全使用手冊(ZT首先我們了解一下Windows的消息機(jī)制。Windows是一個消息驅(qū)動式系統(tǒng),Windows消息提供應(yīng)用程序與應(yīng)用程序之間,應(yīng)用程序與Windows系統(tǒng)之間進(jìn)行通信的手段。舉個例子,打開記事本程序,該程序有一個“文件“菜單。那么,在運(yùn)行該程序的時候,如果用戶單擊“文件菜單“里的“新建“命令,這個動作將被Windows所捕捉,Windows經(jīng)過分析得知這個動作應(yīng)該由我們打開的記事本程序所來處理,然后Windows就發(fā)送個消息譬如我們編程的時候有時用到的 WM_COMMAND的消息給記事本,然后記事本就把這個消息處理掉。這個過程就是消息處理。接下來,我們
2、把SendMessage的完整形式講一下SendMessageDeclare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any AsLong別名SendMessageA說明調(diào)用一個窗口的窗口函數(shù),將一條消息發(fā)給那個窗口。除非消息處理完畢,否則該函數(shù)不會返回SendMessage所包含4個參數(shù)hwnd 32位的窗口句柄窗口可以是任何類型的屏幕對象
3、,因?yàn)閃in32能夠維護(hù)大多數(shù)可視對象的句柄wMsg 用于區(qū)別其他消息的常量值,這些常量可以是Windows單元中預(yù)定義的常量,也可以是自定義的常量wParam 通常是一個與消息有關(guān)的常量值,也可能是窗口或控件的句柄lParam 通常是一個指向內(nèi)存中數(shù)據(jù)的指針。由于WParm、lParam和Pointer 都是32位的,因此,它們之間可以相互轉(zhuǎn)換wMsg函數(shù)WM_CREATE 創(chuàng)建一個窗口WM_DESTROY 當(dāng)一個窗口被破壞時發(fā)送WM_MOVE 移動一個窗口WM_SIZE 改變一個窗口的大小WM_ACTIVATE 一個窗口被激活或失去激活狀態(tài)WM_SETFOCUS 一個窗口獲得焦點(diǎn)WM_KI
4、LLFOCUS 一個窗口失去焦點(diǎn)WM_ENABLE 一個窗口改變成Enable狀態(tài)WM_SETREDRAW 設(shè)置窗口是否能重畫WM_SETTEXT 應(yīng)用程序發(fā)送此消息來設(shè)置一個窗口的文本W(wǎng)M_GETTEXT 應(yīng)用程序發(fā)送此消息來復(fù)制對應(yīng)窗口的文本到緩沖區(qū)WM_GETTEXTLENGTH 得到與一個窗口有關(guān)的文本的長度(不包含空字符WM_PAINT 要求一個窗口重畫自己WM_CLOSE 當(dāng)一個窗口或應(yīng)用程序要關(guān)閉時發(fā)送一個信號WM_QUERYENDSESSION 當(dāng)用戶選擇結(jié)束對話框或程序自己調(diào)用ExitWindows函數(shù)WM_QUIT 用來結(jié)束程序運(yùn)行WM_QUERYOPEN 當(dāng)用戶窗口恢復(fù)以
5、前的大小位置時,把此消息發(fā)送給某個圖標(biāo)WM_ERASEBKGND 當(dāng)窗口背景必須被擦除時(例在窗口改變大小時WM_SYSCOLORCHANGE 當(dāng)系統(tǒng)顏色改變時,發(fā)送此消息給所有頂級窗口WM_ENDSESSION 當(dāng)系統(tǒng)進(jìn)程發(fā)出WM_QUERYENDSESSION 消息后,此消息發(fā)送給應(yīng)用程序,通知它對話是否結(jié)束WM_SHOWWINDOW 當(dāng)隱藏或顯示窗口是發(fā)送此消息給這個窗口WM_ACTIVATEAPP發(fā)此消息給應(yīng)用程序哪個窗口是激活的,哪個是非激活的WM_FONTCHANGE 當(dāng)系統(tǒng)的字體資源庫變化時發(fā)送此消息給所有頂級窗口WM_TIMECHANGE 當(dāng)系統(tǒng)的時間變化時發(fā)送此消息給所有頂級
6、窗口WM_CANCELMODE 發(fā)送此消息來取消某種正在進(jìn)行的摸態(tài)(操作WM_SETCURSOR 如果鼠標(biāo)引起光標(biāo)在某個窗口中移動且鼠標(biāo)輸入沒有被捕獲時,就發(fā)消息給某個窗口WM_MOUSEACTIVATE 當(dāng)光標(biāo)在某個非激活的窗口中而用戶正按著鼠標(biāo)的某個鍵發(fā)送此消息給當(dāng)前窗口WM_CHILDACTIVATE 發(fā)送此消息給MDI子窗口當(dāng)用戶點(diǎn)擊此窗口的標(biāo)題欄,或當(dāng)窗口被激活,移動,改變大小WM_QUEUESYNC 此消息由基于計(jì)算機(jī)的訓(xùn)練程序發(fā)送,通過WH_JOURNALPALYBACK的hook程序分離出用戶輸入消息WM_GETMINMAXINFO 此消息發(fā)送給窗口當(dāng)它將要改變大小或位置WM_
7、PAINTICON 發(fā)送給最小化窗口當(dāng)它圖標(biāo)將要被重畫WM_ICONERASEBKGND 此消息發(fā)送給某個最小化窗口,僅當(dāng)它在畫圖標(biāo)前它的背景必須被重畫WM_NEXTDLGCTL 發(fā)送此消息給一個對話框程序去更改焦點(diǎn)位置WM_SPOOLERSTATUS 每當(dāng)打印管理列隊(duì)增加或減少一條作業(yè)時發(fā)出此消息WM_DRAWITEM 當(dāng)button,combobox,listbox,menu 的可視外觀改變時發(fā)送WM_MEASUREITEM 當(dāng)button, combo box, list box, list, view control, or menu item 被創(chuàng)建時WM_VKEYTOITEM 此消
8、息有一個LBS_WANTKEYBOARDINPUT 風(fēng)格的發(fā)出給它的所有者來響應(yīng)WM_KEYDOWN消息WM_CHARTOITEM 此消息由一個LBS_WANTKEYBOARDINPUT 風(fēng)格的列表框發(fā)送給他的所有者來響應(yīng)WM_CHAR消息WM_SETFONT 當(dāng)繪制文本時程序發(fā)送此消息得到控件要用的顏色WM_GETFONT 應(yīng)用程序發(fā)送此消息得到當(dāng)前控件繪制文本的字體WM_SETHOTKEY 應(yīng)用程序發(fā)送此消息讓一個窗口與一個熱鍵相關(guān)連WM_GETHOTKEY 應(yīng)用程序發(fā)送此消息來判斷熱鍵與某個窗口是否有關(guān)聯(lián)WM_QUERYDRAGICON 此消息發(fā)送給最小化窗口,當(dāng)此窗口將要被拖放而它的類
9、中沒有定義圖標(biāo),應(yīng)用程序能返回一個圖標(biāo)或光標(biāo)的句柄,當(dāng)用戶拖放圖標(biāo)時系統(tǒng)顯示這個圖標(biāo)或光標(biāo)WM_COMPAREITEM 發(fā)送此消息來判定combobox或listbox 新增加的項(xiàng)的相對位置WM_COMPACTING 顯示內(nèi)存已經(jīng)很少了WM_WINDOWPOSCHANGING 發(fā)送此消息給那個窗口的大小和位置將要被改變時,來調(diào)用setwindowpos函數(shù)或其它窗口管理函數(shù)WM_WINDOWPOSCHANGED 發(fā)送此消息給那個窗口的大小和位置已經(jīng)被改變時,來調(diào)用setwindowpos函數(shù)或其它窗口管理函數(shù)WM_POWER 當(dāng)系統(tǒng)將要進(jìn)入暫停狀態(tài)時發(fā)送此消息 WM_COPYDATA 當(dāng)一個應(yīng)
10、用程序傳遞數(shù)據(jù)給另一個應(yīng)用程序時發(fā)送此消息WM_CANCELJOURNA 當(dāng)某個用戶取消程序日志激活狀態(tài),提交此消息給程序WM_NOTIFY 當(dāng)某個控件的某個事件已經(jīng)發(fā)生或這個控件需要得到一些信息時,發(fā)送此消息給它的父窗口WM_INPUTLANGCHANGEREQUEST 當(dāng)用戶選擇某種輸入語言,或輸入語言的熱鍵改變WM_INPUTLANGCHANGE 當(dāng)平臺現(xiàn)場已經(jīng)被改變后發(fā)送此消息給受影響的最頂級窗口WM_TCARD 當(dāng)程序已經(jīng)初始化windows幫助例程時發(fā)送此消息給應(yīng)用程序WM_HELP 此消息顯示用戶按下了F1,如果某個菜單是激活的,就發(fā)送此消息個此窗口關(guān)聯(lián)的菜單,否則就發(fā)送給有焦點(diǎn)
11、的窗口,如果當(dāng)前都沒有焦點(diǎn),就把此消息發(fā)送給當(dāng)前激活的窗口WM_USERCHANGED 當(dāng)用戶已經(jīng)登入或退出后發(fā)送此消息給所有的窗口,當(dāng)用戶登入或退出時系統(tǒng)更新用戶的具體設(shè)置信息,在用戶更新設(shè)置時系統(tǒng)馬上發(fā)送此消息 WM_NOTIFYformAT 公用控件,自定義控件和他們的父窗口通過此消息來判斷控件是使用ANSI還是UNICODE結(jié)構(gòu)WM_CONTEXTMENU 當(dāng)用戶某個窗口中點(diǎn)擊了一下右鍵就發(fā)送此消息給這個窗口WM_styleCHANGING 當(dāng)調(diào)用SETWINDOWLONG函數(shù)將要改變一個或多個窗口的風(fēng)格時發(fā)送此消息給那個窗口WM_styleCHANGED 當(dāng)調(diào)用SETWINDOWLO
12、NG函數(shù)一個或多個窗口的風(fēng)格后發(fā)送此消息給那個窗口WM_DISPLAYCHANGE 當(dāng)顯示器的分辨率改變后發(fā)送此消息給所有的窗口WM_GETICON 此消息發(fā)送給某個窗口來返回與某個窗口有關(guān)連的大圖標(biāo)或小圖標(biāo)的句柄WM_SETICON 程序發(fā)送此消息讓一個新的大圖標(biāo)或小圖標(biāo)與某個窗口關(guān)聯(lián)WM_NCCREATE 當(dāng)某個窗口第一次被創(chuàng)建時,此消息在WM_CREATE消息發(fā)送前發(fā)送WM_NCDESTROY 此消息通知某個窗口,非客戶區(qū)正在銷毀WM_NCCALCSIZE 當(dāng)某個窗口的客戶區(qū)域必須被核算時發(fā)送此消息WM_NCHITTEST 移動鼠標(biāo),按住或釋放鼠標(biāo)時發(fā)生WM_NCPAINT 程序發(fā)送此消
13、息給某個窗口當(dāng)它(窗口的框架必須被繪制時WM_NCACTIVATE 此消息發(fā)送給某個窗口僅當(dāng)它的非客戶區(qū)需要被改變來顯示是激活還是非激活狀態(tài)WM_GETDLGCODE 發(fā)送此消息給某個與對話框程序關(guān)聯(lián)的控件,widdows控制方位鍵和TAB鍵使輸入進(jìn)入此控件通過應(yīng)WM_NCMOUSEMOVE 當(dāng)光標(biāo)在一個窗口的非客戶區(qū)內(nèi)移動時發(fā)送此消息給這個窗口非客戶區(qū)為:窗體的標(biāo)題欄及窗的邊框體WM_NCLBUTTONDOWN 當(dāng)光標(biāo)在一個窗口的非客戶區(qū)同時按下鼠標(biāo)左鍵時提交此消息WM_NCLBUTTONUP 當(dāng)用戶釋放鼠標(biāo)左鍵同時光標(biāo)某個窗口在非客戶區(qū)十發(fā)送此消息WM_NCLBUTTONDBLCLK 當(dāng)用
14、戶雙擊鼠標(biāo)左鍵同時光標(biāo)某個窗口在非客戶區(qū)十發(fā)送此消息WM_NCRBUTTONDOWN 當(dāng)用戶按下鼠標(biāo)右鍵同時光標(biāo)又在窗口的非客戶區(qū)時發(fā)送此消息WM_NCRBUTTONUP 當(dāng)用戶釋放鼠標(biāo)右鍵同時光標(biāo)又在窗口的非客戶區(qū)時發(fā)送此消息WM_NCRBUTTONDBLCLK 當(dāng)用戶雙擊鼠標(biāo)右鍵同時光標(biāo)某個窗口在非客戶區(qū)十發(fā)送此消息WM_NCMBUTTONDOWN 當(dāng)用戶按下鼠標(biāo)中鍵同時光標(biāo)又在窗口的非客戶區(qū)時發(fā)送此消息WM_NCMBUTTONUP 當(dāng)用戶釋放鼠標(biāo)中鍵同時光標(biāo)又在窗口的非客戶區(qū)時發(fā)送此消息WM_NCMBUTTONDBLCLK 當(dāng)用戶雙擊鼠標(biāo)中鍵同時光標(biāo)又在窗口的非客戶區(qū)時發(fā)送此消息WM_K
15、EYFIRST WM_KEYDOWN 按下一個鍵WM_KEYUP 釋放一個鍵WM_CHAR 按下某鍵,并已發(fā)出WM_KEYDOWN, WM_KEYUP消息WM_DEADCHAR 當(dāng)用translatemessage函數(shù)翻譯WM_KEYUP 消息時發(fā)送此消息給擁有焦點(diǎn)的窗口 WM_SYSKEYDOWN 當(dāng)用戶按住ALT鍵同時按下其它,鍵時提交此消息給擁有焦點(diǎn)的窗口WM_SYSKEYUP 當(dāng)用戶釋放一個鍵同時ALT 鍵還按著時提交此消息給擁有焦點(diǎn)的窗口WM_SYSCHAR 當(dāng)WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數(shù)翻譯后提交此消息給擁有焦點(diǎn)的窗口WM_SYSDEADCH
16、AR 當(dāng)WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數(shù)翻譯后發(fā)送此消息給擁有焦點(diǎn)的窗口WM_INITDIALOG 在一個對話框程序被顯示前發(fā)送此消息給它,通常用此消息初始化控件和執(zhí)行其它任務(wù)WM_COMMAND 當(dāng)用戶選擇一條菜單命令項(xiàng)或當(dāng)某個控件發(fā)送一條消息給它的父窗口,一個快捷鍵被翻譯WM_SYSCOMMAND 當(dāng)用戶選擇窗口菜單的一條命令或當(dāng)用戶選擇最大化或最小化時那個窗口會收到此消息WM_TIMER 發(fā)生了定時器事件WM_HSCROLL 當(dāng)一個窗口標(biāo)準(zhǔn)水平滾動條產(chǎn)生一個滾動事件時發(fā)送此消息給那個窗口,也發(fā)送給擁有它的控件WM_VSCROLL 當(dāng)一個窗口標(biāo)準(zhǔn)垂直滾動
17、條產(chǎn)生一個滾動事件時發(fā)送此消息給那個窗口也,發(fā)送給擁有它的控件WM_INITMENU 當(dāng)一個菜單將要被激活時發(fā)送此消息,它發(fā)生在用戶菜單條中的某項(xiàng)或按下某個菜單鍵,它允許程序在顯示前更改菜單WM_INITMENUPOPUP 當(dāng)一個下拉菜單或子菜單將要被激活時發(fā)送此消息,它允許程序在它顯示前更改菜單,而不要改變?nèi)縒M_MENUSELECT 當(dāng)用戶選擇一條菜單項(xiàng)時發(fā)送此消息給菜單的所有者(一般是窗口WM_MENUCHAR 當(dāng)菜單已被激活用戶按下了某個鍵(不同于加速鍵,發(fā)送此消息給菜單的所有者WM_ENTERIDLE 當(dāng)一個模態(tài)對話框或菜單進(jìn)入空載狀態(tài)時發(fā)送此消息給它的所有者,一個模態(tài)對話框或菜單
18、進(jìn)入空載狀態(tài)就是在處理完一條或幾條先前的消息后沒有消息它的列隊(duì)中等待WM_CTLCOLORMSGBOX 在windows繪制消息框前發(fā)送此消息給消息框的所有者窗口,通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置消息框的文本和背景顏色WM_CTLCOLOREDIT 當(dāng)一個編輯型控件將要被繪制時發(fā)送此消息給它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置編輯框的文本和背景顏色WM_CTLCOLORLISTBOX 當(dāng)一個列表框控件將要被繪制前發(fā)送此消息給它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置列表框的文本
19、和背景顏色WM_CTLCOLORBTN 當(dāng)一個按鈕控件將要被繪制時發(fā)送此消息給它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置按紐的文本和背景顏色WM_CTLCOLORDLG 當(dāng)一個對話框控件將要被繪制前發(fā)送此消息給它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置對話框的文本背景顏色WM_CTLCOLORSCROLLBAR 當(dāng)一個滾動條控件將要被繪制時發(fā)送此消息給它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置滾動條的背景顏色WM_CTLCOLORSTATIC 當(dāng)一個靜態(tài)控件將要被繪制時發(fā)送此消息給
20、它的父窗口通過響應(yīng)這條消息,所有者窗口可以通過使用給定的相關(guān)顯示設(shè)備的句柄來設(shè)置靜態(tài)控件的文本和背景顏色WM_MOUSEFIRST WM_MOUSEMOVE 移動鼠標(biāo)WM_LBUTTONDOWN 按下鼠標(biāo)左鍵WM_LBUTTONUP 釋放鼠標(biāo)左鍵WM_LBUTTONDBLCLK 雙擊鼠標(biāo)左鍵WM_RBUTTONDOWN 按下鼠標(biāo)右鍵WM_RBUTTONUP 釋放鼠標(biāo)右鍵WM_RBUTTONDBLCLK 雙擊鼠標(biāo)右鍵WM_MBUTTONDOWN 按下鼠標(biāo)中鍵WM_MBUTTONUP 釋放鼠標(biāo)中鍵WM_MBUTTONDBLCLK 雙擊鼠標(biāo)中鍵WM_MOUSEWHEEL 當(dāng)鼠標(biāo)輪子轉(zhuǎn)動時發(fā)送此消息個
21、當(dāng)前有焦點(diǎn)的控件WM_PARENTNOTIFY 當(dāng)MDI子窗口被創(chuàng)建或被銷毀,或用戶按了一下鼠標(biāo)鍵而光標(biāo)在子窗口上時發(fā)送此消息給它的父窗口WM_ENTERMENULOOP 發(fā)送此消息通知應(yīng)用程序的主窗口that已經(jīng)進(jìn)入了菜單循環(huán)模式WM_EXITMENULOOP 發(fā)送此消息通知應(yīng)用程序的主窗口that已退出了菜單循環(huán)模式WM_SIZING 當(dāng)用戶正在調(diào)整窗口大小時發(fā)送此消息給窗口通過此消息應(yīng)用程序可以監(jiān)視窗口大小和位置也可以修改他們WM_CAPTURECHANGED 發(fā)送此消息給窗口當(dāng)它失去捕獲的鼠標(biāo)時WM_MOVING 當(dāng)用戶在移動窗口時發(fā)送此消息,通過此消息應(yīng)用程序可以監(jiān)視窗口大小和位置也
22、可以修改他們WM_POWERBROADCAST 此消息發(fā)送給應(yīng)用程序來通知它有關(guān)電源管理事件WM_DEVICECHANGE 當(dāng)設(shè)備的硬件配置改變時發(fā)送此消息給應(yīng)用程序或設(shè)備驅(qū)動程序WM_MDIDESTROY 應(yīng)用程序發(fā)送此消息給多文檔的客戶窗口來關(guān)閉一個MDI 子窗口WM_MDIACTIVATE 應(yīng)用程序發(fā)送此消息給多文檔的客戶窗口通知客戶窗口激活另一個MDI子窗口,當(dāng)客戶窗口收到此消息后,它發(fā)出WM_MDIACTIVE消息給MDI子窗口(未激活激活它WM_MDIRESTORE 程序發(fā)送此消息給MDI客戶窗口讓子窗口從最大最小化恢復(fù)到原來大小WM_MDINEXT 程序發(fā)送此消息給MDI客戶窗口
23、激活下一個或前一個窗口WM_MDIMAXIMIZE 程序發(fā)送此消息給MDI客戶窗口來最大化一個MDI子窗口WM_MDITILE 程序發(fā)送此消息給MDI客戶窗口以平鋪方式重新排列所有MDI子窗口WM_MDICASCADE 程序發(fā)送此消息給MDI客戶窗口以層疊方式重新排列所有MDI子窗口WM_MDIICONARRANGE 程序發(fā)送此消息給MDI客戶窗口重新排列所有最小化的MDI子窗口WM_MDIGETACTIVE 程序發(fā)送此消息給MDI客戶窗口來找到激活的子窗口的句柄WM_MDISETMENU 程序發(fā)送此消息給MDI客戶窗口用MDI菜單代替子窗口的菜單WM_CUT 程序發(fā)送此消息給一個編輯框或co
24、mbobox來刪除當(dāng)前選擇的文本W(wǎng)M_COPY 程序發(fā)送此消息給一個編輯框或combobox來復(fù)制當(dāng)前選擇的文本到剪貼板WM_PASTE 程序發(fā)送此消息給editcontrol或combobox從剪貼板中得到數(shù)據(jù)WM_CLEAR 程序發(fā)送此消息給editcontrol或combobox清除當(dāng)前選擇的內(nèi)容WM_UNDO 程序發(fā)送此消息給editcontrol或combobox撤消最后一次操作WM_DESTROYCLIPBOARD 當(dāng)調(diào)用ENPTYCLIPBOARD函數(shù)時發(fā)送此消息給剪貼板的所有者WM_DRAWCLIPBOARD 當(dāng)剪貼板的內(nèi)容變化時發(fā)送此消息給剪貼板觀察鏈的第一個窗口它允許用剪貼
25、板觀察窗口來顯示剪貼板的新內(nèi)容WM_PAINTCLIPBOARD 當(dāng)剪貼板包含CF_OWNERDIPLAY格式的數(shù)據(jù)并且剪貼板觀察窗口的客戶區(qū)需要重畫WM_SIZECLIPBOARD 當(dāng)剪貼板包含CF_OWNERDIPLAY格式的數(shù)據(jù)并且剪貼板觀察窗口的客戶區(qū)域的大小已經(jīng)改變是此消息通過剪貼板觀察窗口發(fā)送給剪貼板的所有者WM_ASKCBformATNAME 通過剪貼板觀察窗口發(fā)送此消息給剪貼板的所有者來請求一個CF_OWNERDISPLAY格式的剪貼板的名字WM_CHANGECBCHAIN 當(dāng)一個窗口從剪貼板觀察鏈中移去時發(fā)送此消息給剪貼板觀察鏈的第一個窗口WM_HSCROLLCLIPBOAR
26、D 此消息通過一個剪貼板觀察窗口發(fā)送給剪貼板的所有者它發(fā)生在當(dāng)剪貼板包含CFOWNERDISPALY格式的數(shù)據(jù)并且有個事件在剪貼板觀察窗的水平滾動條上所有者應(yīng)滾動剪貼板圖象并更新滾動條的值WM_QUERYNEWPALETTE 此消息發(fā)送給將要收到焦點(diǎn)的窗口,此消息能使窗口在收到焦點(diǎn)時同時有機(jī)會實(shí)現(xiàn)他的邏輯調(diào)色板WM_PALETTEISCHANGING 當(dāng)一個應(yīng)用程序正要實(shí)現(xiàn)它的邏輯調(diào)色板時發(fā)此消息通知所有的應(yīng)用程序WM_PALETTECHANGED 此消息在一個擁有焦點(diǎn)的窗口實(shí)現(xiàn)它的邏輯調(diào)色板后發(fā)送此消息給所有頂級并重疊的窗口,以此來改變系統(tǒng)調(diào)色板WM_HOTKEY 當(dāng)用戶按下由REGISTE
27、RHOTKEY函數(shù)注冊的熱鍵時提交此消息WM_PRINT 應(yīng)用程序發(fā)送此消息僅當(dāng)WINDOWS或其它應(yīng)用程序發(fā)出一個請求要求繪制一個應(yīng)用程序的一部分什么是消息?消息系統(tǒng)對于一個win32程序來說十分重要,它是一個程序運(yùn)行的動力源泉。一個消息,是系統(tǒng)定義的一個32位的值,他唯一的定義了一個事件,向Windows發(fā)出一個通知,告訴應(yīng)用程序某個事情發(fā)生了。例如,單擊鼠標(biāo)、改變窗口尺寸、按下鍵盤上的一個鍵都會使Windows 發(fā)送一個消息給應(yīng)用程序。消息本身是作為一個記錄傳遞給應(yīng)用程序的,這個記錄中包含了消息的類型以及其他信息。例如,對于單擊鼠標(biāo)所產(chǎn)生的消息來說,這個記錄中包含了單擊鼠標(biāo)時的坐標(biāo)。這個
28、記錄類型叫做MSG,MSG含有來自windows應(yīng)用程序消息隊(duì)列的消息信息,它在Windows中聲明如下:typedef struct tagMsgHWND hwnd; 接受該消息的窗口句柄UINT message; 消息常量標(biāo)識符,也就是我們通常所說的消息號WPARAM wParam; 32位消息的特定附加信息,確切含義依賴于消息值LPARAM lParam; 32位消息的特定附加信息,確切含義依賴于消息值DWORD time; 消息創(chuàng)建時的時間POINT pt; 消息創(chuàng)建時的鼠標(biāo)/光標(biāo)在屏幕坐標(biāo)系中的位置MSG;消息可以由系統(tǒng)或者應(yīng)用程序產(chǎn)生。系統(tǒng)在發(fā)生輸入事件時產(chǎn)生消息。舉個例子, 當(dāng)用
29、戶敲鍵, 移動鼠標(biāo)或者單擊控件。系統(tǒng)也產(chǎn)生消息以響應(yīng)由應(yīng)用程序帶來的變化, 比如應(yīng)用程序改變系統(tǒng)字體改變窗體大小。應(yīng)用程序可以產(chǎn)生消息使窗體執(zhí)行任務(wù),或者與其他應(yīng)用程序中的窗口通訊。消息中有什么?我們給出了上面的注釋,是不是會對消息結(jié)構(gòu)有了一個比較清楚的認(rèn)識?如果還沒有,那么我們再試著給出下面的解釋:hwnd 32位的窗口句柄。窗口可以是任何類型的屏幕對象,因?yàn)閃in32能夠維護(hù)大多數(shù)可視對象的句柄(窗口、對話框、按鈕、編輯框等。message用于區(qū)別其他消息的常量值,這些常量可以是Windows單元中預(yù)定義的常量,也可以是自定義的常量。消息標(biāo)識符以常量命名的方式指出消息的含義。當(dāng)窗口過程接收
30、到消息之后,他就會使用消息標(biāo)識符來決定如何處理消息。例如、WM_PAINT告訴窗口過程窗體客戶區(qū)被改變了需要重繪。符號常量指定系統(tǒng)消息屬于的類別,其前綴指明了處理解釋消息的窗體的類型。wParam 通常是一個與消息有關(guān)的常量值,也可能是窗口或控件的句柄。lParam 通常是一個指向內(nèi)存中數(shù)據(jù)的指針。由于WParam、lParam和Pointer都是32位的,因此,它們之間可以相互轉(zhuǎn)換。消息標(biāo)識符的值系統(tǒng)保留消息標(biāo)識符的值在0x0000在0x03ff(WM_USER-1范圍。這些值被系統(tǒng)定義消息使用。應(yīng)用程序不能使用這些值給自己的消息。應(yīng)用程序消息從WM_USER(0X0400到0X7FFF,或
31、0XC000到0XFFFF;WM_USER到0X7FFF范圍的消息由應(yīng)用程序自己使用;0XC000到0XFFFF范圍的消息用來和其他應(yīng)用程序通信,我們順便說一下具有標(biāo)志性的消息值:WM_NULL-0x0000 空消息。0x0001-0x0087 主要是窗口消息。0x00A0-0x00A9 非客戶區(qū)消息0x0100-0x0108 鍵盤消息0x0111-0x0126 菜單消息0x0132-0x0138 顏色控制消息0x0200-0x020A 鼠標(biāo)消息0x0211-0x0213 菜單循環(huán)消息0x0220-0x0230 多文檔消息0x03E0-0x03E8 DDE消息LBN_DBLCLK 用戶雙擊了一
32、項(xiàng) LBN_ERRSPACE 列表框內(nèi)存不夠 LBN_KILLFOCUS 列表框正在失去輸入焦點(diǎn) LBN_SELCANCEL 選擇被取消 LBN_SELCHANGE 選擇了另一項(xiàng) LBN_SETFOCUS 列表框獲得輸入焦點(diǎn) 隊(duì)列消息和非隊(duì)列消息 從消息的發(fā)送途徑來看,消息可以分成2種:隊(duì)列消息和非隊(duì)列消息。消息隊(duì)列由可 以分成系統(tǒng)消息隊(duì)列和線程消息隊(duì)列。系統(tǒng)消息隊(duì)列由Windows維護(hù),線程消息隊(duì)列則由 每個GUI線程自己進(jìn)行維護(hù),為避免給non-GUI現(xiàn)成創(chuàng)建消息隊(duì)列,所有線程產(chǎn)生時并沒有 消息隊(duì)列,僅當(dāng)線程第一次調(diào)用GDI函數(shù)數(shù)系統(tǒng)給線程創(chuàng)建一個消息隊(duì)列。隊(duì)列消息送到 系統(tǒng)消息隊(duì)列,然后
33、到線程消息隊(duì)列;非隊(duì)列消息直接送給目的窗口過程。 對于隊(duì)列消息,最常見的是鼠標(biāo)和鍵盤觸發(fā)的消息,例如WM_MOUSERMOVE,WM_CHAR等 消息,還有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。當(dāng)鼠標(biāo)、鍵盤事件 被觸發(fā)后,相應(yīng)的鼠標(biāo)或鍵盤驅(qū)動程序就會把這些事件轉(zhuǎn)換成相應(yīng)的消息,然后輸送到系 統(tǒng)消息隊(duì)列,由Windows系統(tǒng)去進(jìn)行處理。Windows系統(tǒng)則在適當(dāng)?shù)臅r機(jī),從系統(tǒng)消息隊(duì)列 中取出一個消息,根據(jù)前面我們所說的MSG消息結(jié)構(gòu)確定消息是要被送往那個窗口,然后 把取出的消息送往創(chuàng)建窗口的線程的相應(yīng)隊(duì)列,下面的事情就該由線程消息隊(duì)列操心了, Windows開
34、始忙自己的事情去了。線程看到自己的消息隊(duì)列中有消息,就從隊(duì)列中取出 來,通過操作系統(tǒng)發(fā)送到合適的窗口過程去處理。 /有關(guān)Windows中消息的走向的說明 一般來講,系統(tǒng)總是將消息Post在消息隊(duì)列的末尾。這樣保證窗口以先進(jìn)先出的順 序接受消息。然而,WM_PAINT是一個例外,同一個窗口的多個 WM_PAINT被合并成一個 WM_PAINT 消息, 合并所有的無效區(qū)域到一個無效區(qū)域。合并WM_PAIN的目的是為了減少刷 新窗口的次數(shù)。 非隊(duì)列消息將會繞過系統(tǒng)隊(duì)列和消息隊(duì)列,直接將消息發(fā)送到窗口過程,。系統(tǒng)發(fā) 送非隊(duì)列消息通知窗口,系統(tǒng)發(fā)送消息通知窗口。 例如,當(dāng)用戶激活一個窗口系統(tǒng)發(fā)送 WM_
35、ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。這些消息通知窗口它被激活了。非隊(duì)列 消息也可以由當(dāng)應(yīng)用程序調(diào)用系統(tǒng)函數(shù)產(chǎn)生。例如,當(dāng)程序調(diào)用SetWindowPos系統(tǒng)發(fā)送 WM_WINDOWPOSCHANGED消息。一些函數(shù)也發(fā)送非隊(duì)列消息,例如下面我們要談到的函數(shù)。 消息的發(fā)送 了解了上面的這些基礎(chǔ)理論之后,我們就可以進(jìn)行一下簡單的消息發(fā)送與接收。 把一個消息發(fā)送到窗口有3種方式:發(fā)送、寄送和廣播。 發(fā)送消息的函數(shù)有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;寄送消息的函數(shù)主要有PostMessage、PostThreadMessage、 PostQuitMessage;廣播消息的函數(shù)我知道的只有BroadcastSystemMessage、 BroadcastSystemMessageEx。 SendMessage的原型如下:LRESULT SendMessa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 離婚后房屋贈與協(xié)議書范文
- 檢測框架合作協(xié)議書范本
- 贈與閱覽室圖書合同
- 二手電動車購買協(xié)議書范本
- 2025年標(biāo)準(zhǔn)合同終止協(xié)議電子范本
- 2025家居裝修維修合同樣本
- 法院調(diào)解私下協(xié)議書
- 財(cái)產(chǎn)和解協(xié)議書范本
- 2025年03月江蘇南京信息工程大學(xué)科研助理公開招聘1人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2025年03月四川成都農(nóng)業(yè)科技中心公開招聘筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 信息安全等級保護(hù)管理辦法
- 消防更換設(shè)備方案范本
- 2024年環(huán)境影響評估試題及答案
- 【初中歷史】2024-2025學(xué)年部編版七年級下學(xué)期歷史中考復(fù)習(xí)提綱
- 《電力建設(shè)工程施工安全管理導(dǎo)則》(nbt10096-2018)
- 全過程工程咨詢投標(biāo)方案(技術(shù)方案)
- 湖南省2025屆高三九校聯(lián)盟第二次聯(lián)考?xì)v史試卷(含答案解析)
- 家具全屋定制的成本核算示例-成本實(shí)操
- 在線預(yù)訂平臺在旅行社人力資源管理中的應(yīng)用研究-深度研究
- 暈針暈血的處理及預(yù)防
- 《實(shí)驗(yàn)室儀器管理》課件
評論
0/150
提交評論