Delphi中SendMessage使用說明數據庫
一、SendMessage基礎知識
函數功能:該函數將指定的消息發送到一個或多個窗口。此函數爲指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不一樣,將一個消息寄送到一個線程的消息隊列後當即返回。
函數原型:編程
LRESULT SendMessage( HWND hWnd,//其窗口程序將接收消息的窗口的句柄。若是此參數爲HWND_BROADCAST,則消息將被髮送到系統中全部頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被髮送到子窗口。 UINT Msg, //指定被髮送的消息。用於區別其餘消息的常量值. WPARAM wParam,//指定附加的消息指定信息。 一般是一個與消息有關的常量值,也多是窗口或控件的句柄. LPARAM IParam //指定附加的消息指定信息。 一般是一個指向內存中數據的指針。 );
返回值:返回值指定消息處理的結果,依賴於所發送的消息。
備註:須要用HWND_BROADCAST通訊的應用程序應當使用函數RegisterWindowMessage來爲應用程序間的通訊取得一個惟一的消息。
若是指定的窗口是由調用線程建立的,則窗口程序當即做爲子程序調用。若是指定的窗口是由不一樣線程建立的,則系統切換到該線程並調用恰當的窗口程序。線程間的消息只有在線程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息爲止。
Windows CE:Windows CE不支持Windows桌面平臺支持的全部消息。使用SendMesssge以前,要檢查發送的消息是否被支持。windows
附:Delphi中SendMessage使用技巧數組
Windows系統是由消息機制驅動的,每一個線程若是創建了一個窗口,則由系統分配一個消息隊列用於窗口消息的處理。另外,消息也能夠不通過消息隊列而利用SendMessage函數直接發送給窗口,窗口過程將處理這個消息,但只有當消息被處理以後,SendMessage才能返回到調用程序。下面結合兩個Delphi程序,討論如何利用SendMessage向控件發送消息和控件對這種消息的響應。app
二、用SendMessage向控件發送消息
在編程中,有時須要控件以特殊的風格顯示,而這種要求又沒法經過設置控件屬性實現。例如,讀取客戶列表並顯示在下拉框供用戶選擇,若是下拉框寬度太窄,則不能所有顯示;若是將寬度定得太寬,界面又有不緊湊之感。所以但願能在運行期動態地肯定下拉框顯示區域的寬度,這種要求若是不用SendMessage函數就很難實現。
解決辦法是:在讀數據庫時計算字符串的顯示寬度,用顯示寬度的最大值肯定下拉框顯示區域的寬度。再用SendMessage函數向下拉框發送 CB_SETDROPPEDWIDTH 消息和寬度值,下拉框根據消息中傳來的信息,就能夠進行正確顯示。 部分源程序代碼以下:框架
i:=0; //計數 MaxWidth:=0; Query1.SQL.Clear; Query1.SQL.Add(‘select Company from Customer’); Query1.Open; //讀客戶列表到下拉框 while not Query1.Eof do begin ComboBox1.Items.add(Query1.FieldByName(‘Company’).AsString); Width:=ComboBox1.Font.Size * Length(ComboBox1.Items); if Width>MaxWidth then MaxWidth:=Width; //找出最大值 Query1.Next; i:=i+1; end; Query1.Close; ComboBox1.Text:=ComboBox1.Items[0]; SendMessage(ComboBox1.Handle, CB_SETDROPPEDWIDTH,MaxWidth,0); //發送消息以肯定顯示區域的寬度
利用SendMessage函數還能夠實現一些有趣的效果,例如在按鈕的Click事件中加入以下語句: ide
SendMessage(Button.Handle,BM_SETSTYLE, BS_RADIOBUTTON,1);
運行後點擊按鈕,就能夠把按鈕變成一個收音機按鈕。函數
三、控件接收SendMessage消息
上面討論了用SendMessage向控件發送消息的過程。但凡事有利就有弊,用SendMessage發送的消息在處理上存在着必定困難。由於該消息不通過消息隊列,因此沒法用OnMessage方式來指定對消息的響應,甚至用HookMainWindow也不行,由於消息直接發送到控件,繞過了主窗體。要對這種類型的消息做出響應,須要重載控件的WndProc方法。字體
例如,對於一個列表框,滾動條的滾動消息就是用SendMessage方式發送的,所以該消息不在TlistBox的事件列表中。下面是處理控件響應該滾動消息的具體步驟。ui
3.1 首先從TlistBox繼承一個TmyListBox類,並重載WndProc方法。在程序中加入下列定義:
type TMyListBox=class(TListBox) private procedure WndProc(var Msg: TMessage); override; //重載WndProc,處理髮送到控件的消息 public end;
其中WndProc方法指定控件對消息的響應,輸入參數是TMessage類型,該數據類型是一個記錄,包含了消息代碼和消息的參數,消息參數能夠用Longint或Word方式得到。
3.2 對滾動事件作出響應,在WndProc方法中加入以下處理代碼:
if (Msg.Msg=WM_VSCROLL) and (Msg.WParamLo=SB_ENDSCROLL) then begin //得到鼠標位置對應的列 ItemIndex:=ItemAtPos(Point,true); Form1.Edit1.Text:=inttostr(ItemIndex); inherited; end else inherited;
當程序接收到WM_VSCROLL消息,且WParamLo參數爲SB_ENDSCROLL時,表示豎直滾動條中止滾動,就能夠用
ItemAtPos方法肯定與鼠標位置對應的ItemIndex。ItemAtPos方法的Point參數是一個TPoint類型的變量,用來保存鼠標的位置。
3.3 定義方法ListBoxMouseMove,在鼠標移動時,將當前位置保存在Point中:
procedure TForm1.ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); begin Point.X:=X; Point.Y:=Y; end;
3.4 在運行期建立和初始化列表框,並指定列表框的MouseMove事件對應上一步定義的ListBoxMouseMove方法。
在主窗體的Create事件中輸入下面的代碼:
begin Point.X:=0; Point.Y:=0; //建立自定義列表框 List:=TMyListBox.Create(Form1); List.Parent:=Form1; List.Left:=5; List.Top:=30; List.Width:=150; List.Height:=200; for i:=0 to 300 do begin List.Items.Add(inttostr(i)); //初始化 end; end;
3.5 指定處理MouseMove事件的方法
List.OnMouseMove := ListBoxMouseMove; end;
四、其餘示例
TTreeView: (引用CommCtrl) SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 設置TV背景顏色 SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0); //鼠標左鍵按下 SendMessage(Button.Handle,WM_LBUTTONUP,0,0); //鼠標左鍵擡起 SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); //傳遞文本 SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2); //傳遞字符 SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1); //改變Button風格 SendMessage(ComboBox.Handle,CB_SETDROPPEDWIDTH,300,0); //改變CBDownWidth WM_CUT、WM_COPY和WM_PASTE //剪切,複製,粘帖 //實現任意組合鍵 keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0); keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0); keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
五、SendMessage的參數介紹
LRESULT SendMessage( HWND hWnd,//其窗口程序將接收消息的窗口的句柄。若是此參數爲HWND_BROADCAST,則消息將被髮送到系統中全部頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被髮送到子窗口。 UINT Msg, //指定被髮送的消息。用於區別其餘消息的常量值. WPARAM wParam,//指定附加的消息指定信息。 一般是一個與消息有關的常量值,也多是窗口或控件的句柄. LPARAM IParam //指定附加的消息指定信息。 一般是一個指向內存中數據的指針。 );
wMsg參數常量值:
#DeFine WM_CREATE 0x01 建立一個窗口
#DeFine WM_DESTROY 0x02 當一個窗口被破壞時發送
#DeFine WM_MOVE 0x03 移動一個窗口
#DeFine WM_SIZE 0x05 改變一個窗口的大小
#DeFine WM_ACTIVATE 0x06 一個窗口被激活或失去激活狀態
#DeFine WM_SETFOCUS 0x07 一個窗口得到焦點
#DeFine WM_KILLFOCUS 0x08 一個窗口失去焦點
#DeFine WM_ENABLE 0x0A 一個窗口改變成Enable狀態
#DeFine WM_SETREDRAW 0x0B 設置窗口是否能重畫
#DeFine WM_SETTEXT 0x0C 應用程序發送此消息來設置一個窗口的文本
#DeFine WM_GETTEXT 0x0D 應用程序發送此消息來複制對應窗口的文本到緩衝區
#DeFine WM_GETTEXTLENGTH 0x0E 獲得與一個窗口有關的文本的長度(不包含空字符)
#DeFine WM_PAINT 0x0F 要求一個窗口重畫本身
#DeFine WM_CLOSE 0x10 當一個窗口或應用程序要關閉時發送一個信號
#DeFine WM_QUERYENDSESSION 0x11 當用戶選擇結束對話框或程序本身調用ExitWindows函數
#DeFine WM_QUIT 0x12 用來結束程序運行
#DeFine WM_QUERYOPEN 0x13 當用戶窗口恢復之前的大小位置時,把此消息發送給某個圖標
#DeFine WM_ERASEBKGND 0x14 當窗口背景必須被擦除時(例在窗口改變大小時)
#DeFine WM_SYSCOLORCHANGE 0x15 當系統顏色改變時,發送此消息給全部頂級窗口
#DeFine WM_ENDSESSION 0x16 當系統進程發出WM_QUERYENDSESSION消息後,此消息發送給應用程序,通知它對話是否結束
#DeFine WM_SHOWWINDOW 0x18 當隱藏或顯示窗口是發送此消息給這個窗口
#DeFine WM_ACTIVATEAPP 0x1C 發此消息給應用程序哪一個窗口是激活的,哪一個是非激活的
#DeFine WM_FONTCHANGE 0x1D 當系統的字體資源庫變化時發送此消息給全部頂級窗口
#DeFine WM_TIMECHANGE 0x1E 當系統的時間變化時發送此消息給全部頂級窗口
#DeFine WM_CANCELMODE 0x1F 發送此消息來取消某種正在進行的摸態(操做)
#DeFine WM_SETCURSOR 0x20 若是鼠標引發光標在某個窗口中移動且鼠標輸入沒有被捕獲時,就發消息給某個窗口
#DeFine WM_MOUSEACTIVATE 0x21 當光標在某個非激活的窗口中而用戶正按着鼠標的某個鍵發送此消息給當前窗口
#DeFine WM_CHILDACTIVATE 0x22 發送此消息給MDI子窗口當用戶點擊此窗口的標題欄,或當窗口被激活,移動,改變大小
#DeFine WM_QUEUESYNC 0x23 此消息由基於計算機的訓練程序發送,經過WH_JOURNALPALYBACK的hook程序分離出用戶輸入消息
#DeFine WM_GETMINMAXINFO 0x24 此消息發送給窗口當它將要改變大小或位置
#DeFine WM_PAINTICON 0x26 發送給最小化窗口當它圖標將要被重畫
#DeFine WM_ICONERASEBKGND 0x27 此消息發送給某個最小化窗口,僅當它在畫圖標前它的背景必須被重畫
#DeFine WM_NEXTDLGCTL 0x28 發送此消息給一個對話框程序去更改焦點位置
#DeFine WM_SPOOLERSTATUS 0x2A 每當打印管理列隊增長或減小一條做業時發出此消息
#DeFine WM_DRAWITEM 0x2B 當button,combobox,listbox,menu的可視外觀改變時發送
#DeFine WM_MEASUREITEM 0x2C 當button, combo box, list box, list view control, or menu item 被建立時
#DeFine WM_VKEYTOITEM 0x2E 此消息有一個LBS_WANTKEYBOARDINPUT風格的發出給它的全部者來響應WM_KEYDOWN消息
#DeFine WM_CHARTOITEM 0x2F 此消息由一個LBS_WANTKEYBOARDINPUT風格的列表框發送給他的全部者來響應WM_CHAR消息
#DeFine WM_SETFONT 0x30 當繪製文本時程序發送此消息獲得控件要用的顏色
#DeFine WM_GETFONT 0x31 應用程序發送此消息獲得當前控件繪製文本的字體
#DeFine WM_SETHOTKEY 0x32 應用程序發送此消息讓一個窗口與一個熱鍵相關連
#DeFine WM_GETHOTKEY 0x33 應用程序發送此消息來判斷熱鍵與某個窗口是否有關聯
#DeFine WM_QUERYDRAGICON 0x37 此消息發送給最小化窗口,當此窗口將要被拖放而它的類中沒有定義圖標,應用程序能返回一個圖標或光標的句柄,當用戶拖放圖標時系統顯示這個圖標或光標
#DeFine WM_COMPAREITEM 0x39 發送此消息來斷定combobox或listbox新增長的項的相對位置
#DeFine WM_COMPACTING 0x41 顯示內存已經不多了
#DeFine WM_WINDOWPOSCHANGING 0x46 發送此消息給那個窗口的大小和位置將要被改變時,來調用setwindowpos函數或其它窗口管理函數
#DeFine WM_WINDOWPOSCHANGED 0x47 發送此消息給那個窗口的大小和位置已經被改變時,來調用setwindowpos函數或其它窗口管理函數
#DeFine WM_POWER 0x48 當系統將要進入暫停狀態時發送此消息
#DeFine WM_COPYDATA 0x4A 當一個應用程序傳遞數據給另外一個應用程序時發送此消息
#DeFine WM_CANCELJOURNA 0x4B 當某個用戶取消程序日誌激活狀態,提交此消息給程序
#DeFine WM_NOTIFY 0x4E 當某個控件的某個事件已經發生或這個控件須要獲得一些信息時,發送此消息給它的父窗口
#DeFine WM_INPUTLANGCHANGEREQUEST 0x50 當用戶選擇某種輸入語言,或輸入語言的熱鍵改變
#DeFine WM_INPUTLANGCHANGE 0x51 當平臺現場已經被改變後發送此消息給受影響的最頂級窗口
#DeFine WM_TCARD 0x52 當程序已經初始化windows幫助例程時發送此消息給應用程序
#DeFine WM_HELP 0x53 此消息顯示用戶按下了F1,若是某個菜單是激活的,就發送此消息個此窗口關聯的菜單,不然就發送給有焦點的窗口,若是當前都沒有焦點,就把此消息發送給當前激活的窗口
#DeFine WM_USERCHANGED 0x54 當用戶已經登入或退出後發送此消息給全部的窗口,當用戶登入或退出時系統更新用戶的具體設置信息,在用戶更新設置時系統立刻發送此消息
#DeFine WM_NOTIFYFORMAT 0x55 公用控件,自定義控件和他們的父窗口經過此消息來判斷控件是使用ANSI仍是UNICODE結構
#DeFine WM_CONTEXTMENU ?? 當用戶某個窗口中點擊了一下右鍵就發送此消息給這個窗口
#DeFine WM_STYLECHANGING 0x7C 當調用SETWINDOWLONG函數將要改變一個或多個 窗口的風格時發送此消息給那個窗口
#DeFine WM_STYLECHANGED 0x7D 當調用SETWINDOWLONG函數一個或多個 窗口的風格後發送此消息給那個窗口
#DeFine WM_DISPLAYCHANGE 0x7E 當顯示器的分辨率改變後發送此消息給全部的窗口
#DeFine WM_GETICON 0x7F 此消息發送給某個窗口來返回與某個窗口有關連的大圖標或小圖標的句柄
#DeFine WM_SETICON 0x80 程序發送此消息讓一個新的大圖標或小圖標與某個窗口關聯
#DeFine WM_NCCREATE 0x81 當某個窗口第一次被建立時,此消息在WM_CREATE消息發送前發送
#DeFine WM_NCDESTROY 0x82 此消息通知某個窗口,非客戶區正在銷燬
#DeFine WM_NCCALCSIZE 0x83 當某個窗口的客戶區域必須被覈算時發送此消息
#DeFine WM_NCHITTEST 0x84 移動鼠標,按住或釋放鼠標時發生
#DeFine WM_NCPAINT 0x85 程序發送此消息給某個窗口當它(窗口)的框架必須被繪製時
#DeFine WM_NCACTIVATE 0x86 此消息發送給某個窗口僅當它的非客戶區須要被改變來顯示是激活仍是非激活狀態
#DeFine WM_GETDLGCODE 0x87 發送此消息給某個與對話框程序關聯的控件,widdows控制方位鍵和TAB鍵使輸入進入此控件經過應
#DeFine WM_NCMOUSEMOVE 0xA0 當光標在一個窗口的非客戶區內移動時發送此消息給這個窗口 非客戶區爲:窗體的標題欄及窗 的邊框體
#DeFine WM_NCLBUTTONDOWN 0xA1 當光標在一個窗口的非客戶區同時按下鼠標左鍵時提交此消息
#DeFine WM_NCLBUTTONUP 0xA2 當用戶釋放鼠標左鍵同時光標某個窗口在非客戶區十發送此消息
#DeFine WM_NCLBUTTONDBLCLK 0xA3 當用戶雙擊鼠標左鍵同時光標某個窗口在非客戶區十發送此消息
#DeFine WM_NCRBUTTONDOWN 0xA4 當用戶按下鼠標右鍵同時光標又在窗口的非客戶區時發送此消息
#DeFine WM_NCRBUTTONUP 0xA5 當用戶釋放鼠標右鍵同時光標又在窗口的非客戶區時發送此消息
#DeFine WM_NCRBUTTONDBLCLK 0xA6 當用戶雙擊鼠標右鍵同時光標某個窗口在非客戶區十發送此消息
#DeFine WM_NCMBUTTONDOWN 0xA7 當用戶按下鼠標中鍵同時光標又在窗口的非客戶區時發送此消息
#DeFine WM_NCMBUTTONUP 0xA8 當用戶釋放鼠標中鍵同時光標又在窗口的非客戶區時發送此消息
#DeFine WM_NCMBUTTONDBLCLK 0xA9 當用戶雙擊鼠標中鍵同時光標又在窗口的非客戶區時發送此消息
#DeFine WM_KEYFIRST 0x100 WM_KEYDOWN 按下一個鍵
#DeFine WM_KEYUP 0x101 釋放一個鍵
#DeFine WM_CHAR 0x102 按下某鍵,並已發出WM_KEYDOWN, WM_KEYUP消息
#DeFine WM_DEADCHAR 0x103 當用translatemessage函數翻譯WM_KEYUP消息時發送此消息給擁有焦點的窗口
#DeFine WM_SYSKEYDOWN 0x104 當用戶按住ALT鍵同時按下其它鍵時提交此消息給擁有焦點的窗口
#DeFine WM_SYSKEYUP 0x105 當用戶釋放一個鍵同時ALT 鍵還按着時提交此消息給擁有焦點的窗口
#DeFine WM_SYSCHAR 0x106 當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後提交此消息給擁有焦點的窗口
#DeFine WM_SYSDEADCHAR 0x107 當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後發送此消息給擁有焦點的窗口
#DeFine WM_INITDIALOG 0x110 在一個對話框程序被顯示前發送此消息給它,一般用此消息初始化控件和執行其它任務
#DeFine WM_COMMAND 0x111 當用戶選擇一條菜單命令項或當某個控件發送一條消息給它的父窗口,一個快捷鍵被翻譯
#DeFine WM_SYSCOMMAND 0x112 當用戶選擇窗口菜單的一條命令或當用戶選擇最大化或最小化時那個窗口會收到此消息
#DeFine WM_TIMER 0x113 發生了定時器事件
#DeFine WM_HSCROLL 0x114 當一個窗口標準水平滾動條產生一個滾動事件時發送此消息給那個窗口,也發送給擁有它的控件
#DeFine WM_VSCROLL 0x115 當一個窗口標準垂直滾動條產生一個滾動事件時發送此消息給那個窗口也,發送給擁有它的控件
#DeFine WM_INITMENU 0x116 當一個菜單將要被激活時發送此消息,它發生在用戶菜單條中的某項或按下某個菜單鍵,它容許程序在顯示前更改菜單
#DeFine WM_INITMENUPOPUP 0x117 當一個下拉菜單或子菜單將要被激活時發送此消息,它容許程序在它顯示前更改菜單,而不要改變所有
#DeFine WM_MENUSELECT 0x11F 當用戶選擇一條菜單項時發送此消息給菜單的全部者(通常是窗口)
#DeFine WM_MENUCHAR 0x120 當菜單已被激活用戶按下了某個鍵(不一樣於加速鍵),發送此消息給菜單的全部者
#DeFine WM_ENTERIDLE 0x121 當一個模態對話框或菜單進入空載狀態時發送此消息給它的全部者,一個模態對話框或菜單進入空載狀態就是在處理完一條或幾條先前的消息後沒有消息它的列隊中等待
#DeFine WM_CTLCOLORMSGBOX 0x132 在windows繪製消息框前發送此消息給消息框的全部者窗口,經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置消息框的文本和背景顏色
#DeFine WM_CTLCOLOREDIT 0x133 當一個編輯型控件將要被繪製時發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置編輯框的文本和背景顏色
#DeFine WM_CTLCOLORLISTBOX 0x134 當一個列表框控件將要被繪製前發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置列表框的文本和背景顏色
#DeFine WM_CTLCOLORBTN 0x135 當一個按鈕控件將要被繪製時發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置按紐的文本和背景顏色
#DeFine WM_CTLCOLORDLG 0x136 當一個對話框控件將要被繪製前發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置對話框的文本背景顏色
#DeFine WM_CTLCOLORSCROLLBAR 0x137 當一個滾動條控件將要被繪製時發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠經過使用給定的相關顯示設備的句柄來設置滾動條的背景顏色
#DeFine WM_CTLCOLORSTATIC 0x138 當一個靜態控件將要被繪製時發送此消息給它的父窗口 經過響應這條消息,全部者窗口能夠 經過使用給定的相關顯示設備的句柄來設置靜態控件的文本和背景顏色
#DeFine WM_MOUSEFIRST 0x200 移動鼠標時發生
#DeFine WM_MOUSEMOVE 0x200 移動鼠標時發生,同WM_MOUSEFIRST
#DeFine WM_LBUTTONDOWN 0x201 按下鼠標左鍵
#DeFine WM_LBUTTONUP 0x202 釋放鼠標左鍵
#DeFine WM_LBUTTONDBLCLK 0x203 雙擊鼠標左鍵
#DeFine WM_RBUTTONDOWN 0x204 按下鼠標右鍵
#DeFine WM_RBUTTONUP 0x205 釋放鼠標右鍵
#DeFine WM_RBUTTONDBLCLK 0x206 雙擊鼠標右鍵
#DeFine WM_MBUTTONDOWN 0x207 按下鼠標中鍵
#DeFine WM_MBUTTONUP 0x208 釋放鼠標中鍵
#DeFine WM_MBUTTONDBLCLK 0x209 雙擊鼠標中鍵
#DeFine WM_MOUSEWHEEL 0x20A 當鼠標輪子轉動時發送此消息個當前有焦點的控件 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
六、其餘擴展
SendMessageA
說明: 調用一個窗口的窗口函數,將一條消息發給那個窗口。除非消息處理完畢,不然該函數不會返回SendMessage所包含4個參數:
1. hwnd 32位的窗口句柄窗口能夠是任何類型的屏幕對象,由於Win32可以維護大多數可視對象的句柄
2. wMsg 用於區別其餘消息的常量值,這些常量能夠是Windows單元中預約義的常量,也能夠是自定義的常量
3. wParam 一般是一個與消息有關的常量值,也多是窗口或控件的句柄
4. 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_QUERYENDSESSION 消息後,此消息發送給應用程序,通知它對話是否結束
★WM_SHOWWINDOW 當隱藏或顯示窗口是發送此消息給這個窗口
★WM_ACTIVATEAPP 發此消息給應用程序哪一個窗口是激活的,哪一個是非激活的
★WM_FONTCHANGE 當系統的字體資源庫變化時發送此消息給全部頂級窗口
★WM_TIMECHANGE 當系統的時間變化時發送此消息給全部頂級窗口
★WM_CANCELMODE 發送此消息來取消某種正在進行的摸態(操做)
★WM_SETCURSOR 若是鼠標引發光標在某個窗口中移動
★WM_ENDSESSION 當系統進程發出且鼠標輸入沒有被捕獲時,就發消息給某個窗口
★WM_MOUSEACTIVATE 當光標在某個非激活的窗口中而用戶正按着鼠標的某個鍵發送此消息給當前窗口
★WM_CHILDACTIVATE 送此消息給MDI子窗口當用戶點擊此窗口的標題欄,或當窗口被激活,移動,改變大小
★WM_QUEUESYNC 此消息由基於計算機的訓練程序發送,經過 WH_JOURNALPALYBACK的hook程序分離出用戶輸入消息
★WM_GETMINMAXINFO 此消息發送給窗口當它將要改變大小或位置
★WM_PAINTICON 發送給最小化窗口當它圖標將要被重畫
★WM_ICONERASEBKGND 此消息發送給某個最小化窗口,僅當它在畫圖標前它的背景必須被重畫
★WM_NEXTDLGCT★發送此消息給一個對話框程序去更改焦點位置
★WM_SPOOLERSTATUS 每當打印管理列隊增長或減小一條做業時發出此消息
★WM_DRAWITEM 當button,combobox,listbox,menu的可視外觀改變時發送
★WM_MEASUREITEM 當button, combobox, listbox, listview control, or menuitem 被建立時
★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結構
示例1:
function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; var buffer: array[0..255] of char; begin Result := True; GetClassName(hwnd,buffer,256); if StrPas(Buffer)='Edit' then begin SendMessage(hwnd,WM_GETTEXT,256,lparam); Result:=False; end; end; procedure TForm1.Button1Click(Sender: TObject); var hwnd: Integer; buffer: array[0..255] of char; Begin hwnd := FindWindow('CabinetWClass',nil); if hwnd<> 0 then begin EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0])); Caption := StrPas(buffer); end; end;
示例2:(實現對話框自動定時關閉),在程序中插入一個定時器,設置好時間,在對話框使用前激活定時器。插入代碼:
procedure TfrmMain.Timer1_AutoCloseTimer(Sender: TObject); var AHandle: THandle; begin AHandle := FindWindow('TMessageForm', PChar(application.Title)); if AHandle > 0 then SendMessage(AHandle, WM_CLOSE, 0, 0); end;
建立時間:2019.09.11 更新時間:2020.03.06