delphi中SendMessage使用說明


SendMessage基礎知識
函數功能:該函數將指定的消息發送到一個或多個窗口。此函數為指定的窗口調用窗口程序,直到窗口程序處理完消息再返回。而函數PostMessage不同,將一個消息寄送到一個線程的消息隊列后立即返回。
函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
參數:
hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。
Msg:指定被發送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息處理的結果,依賴於所發送的消息。
備注:需要用HWND_BROADCAST通信的應用程序應當使用函數RegisterWindowMessage來為應用程序間的通信取得一個唯一的消息。
如果指定的窗口是由調用線程創建的,則窗口程序立即作為子程序調用。如果指定的窗口是由不同線程創建的,則系統切換到該線程並調用恰當的窗口程序。線程間的消息只有在線程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。
Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要檢查發送的消息是否被支持。

附:Delphi中SendMessage使用技巧

Windows系統是由消息機制驅動的,每個線程如果建立了一個窗口,則由系統分配一個消息隊列用於窗口消息的處理。另外,消息也可以不經過消息隊
列而利用SendMessage函數直接發送給窗口,窗口過程將處理這個消息,但只有當消息被處理之后,SendMessage才能返回到調用程序。下面
結合兩個Delphi程序,討論如何利用SendMessage向控件發送消息和控件對這種消息的響應。
用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);
運行后點擊按鈕,就可以把按鈕變成一個收音機按鈕。
控件接收SendMessage消息
上面討論了用SendMessage向控件發送消息的過程。但凡事有利就有弊,用SendMessage發送的消息在處理上存在着一定困難。因為該
消息不經過消息隊列,所以無法用OnMessage方式來指定對消息的響應,甚至用HookMainWindow也不行,因為消息直接發送到控件,繞過了
主窗體。要對這種類型的消息作出響應,需要重載控件的WndProc方法。
例如,對於一個列表框,滾動條的滾動消息就是用SendMessage方式發送的,因此該消息不在TlistBox的事件列表中。下面是處理控件響應該滾動消息的具體步驟。
1.首先從TlistBox繼承一個TmyListBox類,並重載WndProc方法。在程序中加入下列定義:
type
TMyListBox=class(TListBox)
private
procedure WndProc(var Msg: TMessage);
override;
//重載WndProc,處理發送到控件的消息
public
end;
其中WndProc方法指定控件對消息的響應,輸入參數是TMessage類型,該數據類型是一個記錄,包含了消息代碼和消息的參數,消息參數可以用Longint或Word方式獲得。
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.定義方法ListBoxMouseMove,在鼠標移動時,將當前位置保存在Point中:
procedure TForm1.ListBoxMouseMove(Sender:
TObject; Shift: TShiftState; X,Y: Integer);
   begin
    Point.X:=X;
    Point.Y:=Y;
   end;
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;
//指定處理MouseMove事件的方法
List.OnMouseMove := ListBoxMouseMove; end;

SendMessage參數
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);

 Windows是一個消息驅動式系統,SendMessage是應用程序和應用程序之間進行消息傳遞的主要手段之一,這里我搜集整理了SendMessage函數的詳細參數介紹,以備自用。
  VFP聲明:
  DECLARE INTEGER SendMessage IN user32;
  INTEGER hWnd,;
  INTEGER wMsg,;
  INTEGER wParam,;
  INTEGER lParam
  參數1:hWnd-窗口句柄。窗口可以是任何類型的屏幕對象。
  參數2:wMsg-用於區別其他消息的常量值.
  參數3:wParam-通常是一個與消息有關的常量值,也可能是窗口或控件的句柄.
  參數4: lParam-通常是一個指向內存中數據的指針。
  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
  最近越來越覺得,windows果然是很不安全啊,,,想要學windows平台的編程,就要學mfc,在win上,mfc簡直無所不能。。。
  
 
 Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=2185728
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結構

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;


免責聲明!

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



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