Delphi Win API 消息函數 SendMessage函數


Delphi中SendMessage使用說明

1、SendMessage基礎知識 
函數功能:該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列后立即返回。 
函數原型:

LRESULT SendMessage(
HWND hWnd,//其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。 
UINT Msg, //指定被發送的消息。用於區別其他消息的常量值. 
WPARAM wParam,//指定附加的消息指定信息。 通常是一個與消息有關的常量值,也可能是窗口或控件的句柄. 
LPARAM IParam  //指定附加的消息指定信息。 通常是一個指向內存中數據的指針。 
); 

返回值:返回值指定消息處理的結果,依賴於所發送的消息。 
備注:需要用HWND_BROADCAST通信的應用程序應當使用函數RegisterWindowMessage來為應用程序間的通信取得一個唯一的消息。 
如果指定的窗口是由調用線程創建的,則窗口程序立即作為子程序調用。如果指定的窗口是由不同線程創建的,則系統切換到該線程並調用恰當的窗口程序。線程間的消息只有在線程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。 
Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要檢查發送的消息是否被支持。

附:Delphi中SendMessage使用技巧

Windows系統是由消息機制驅動的,每個線程如果建立了一個窗口,則由系統分配一個消息隊列用於窗口消息的處理。另外,消息也可以不經過消息隊列而利用SendMessage函數直接發送給窗口,窗口過程將處理這個消息,但只有當消息被處理之后,SendMessage才能返回到調用程序。下面結合兩個Delphi程序,討論如何利用SendMessage向控件發送消息和控件對這種消息的響應。

 

2、用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事件中加入如下語句: 

SendMessage(Button.Handle,BM_SETSTYLE, BS_RADIOBUTTON,1); 

運行后點擊按鈕,就可以把按鈕變成一個收音機按鈕。

 

3、控件接收SendMessage消息 
上面討論了用SendMessage向控件發送消息的過程。但凡事有利就有弊,用SendMessage發送的消息在處理上存在着一定困難。因為該消息不經過消息隊列,所以無法用OnMessage方式來指定對消息的響應,甚至用HookMainWindow也不行,因為消息直接發送到控件,繞過了主窗體。要對這種類型的消息作出響應,需要重載控件的WndProc方法

例如,對於一個列表框,滾動條的滾動消息就是用SendMessage方式發送的,因此該消息不在TlistBox的事件列表中。下面是處理控件響應該滾動消息的具體步驟。

 

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; 

 

4、其他示例

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);

  


5、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 

 

 

6、其他擴展

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM