PostMessage和SendMessage有什麼區別?(有EnumChildWindowsProc的例子)

PostMessage只是把消息放入隊列,無論其餘程序是否處理都返回,而後繼續執行;
而SendMessage必須等待其餘程序處理消息後才返回,繼續執行。
PostMessage的返回值表示PostMessage函數執行是否正確;
而SendMessage的返回值表示其餘程序處理消息後的返回值。html

 


 字號: 大大  中中  小小 教你:Delphi獲取句柄sendmessage 
查找另一個窗口的句柄: handle := FindWindow(nil,PChar('窗口的標題'));//查到窗體句柄
查找子窗體:childHandle := FindWindowEx(handle,0,'子窗體類','子窗體標題');
另外有個枚舉子窗體的API,EnumChildWindows(主創體句柄,@回調函數,用戶參數);
用這個函數須要本身寫一個回調的函數,好比:
function EnumChildProc(ahWND:HWND; param:LPARAM):boolean; stdcall;
sendmessage(handle,message,wl,rl)windows

unit     Unit1;函數

interface字體

uses     Windows,     Messages,Tlhelp32,     SysUtils,     Classes,     Graphics,     Controls,     Forms,     Dialogs,     StdCtrls;ui

type
TForm1     =     class(TForm)
procedure FormCreate(Sender: TObject);指針

private
{     Private     declarations     }
public
{     Public     declarations     }
end;
var     Form1:     TForm1;
implementation
{$R     *.DFM}日誌

procedure TForm1.FormCreate(Sender: TObject);
var a,b:PAnsiChar;
h:HWND;
begin
h:= FindWindow(nil,'abc.txt - 記事本');
h:= FindWindowEx(h,0,'edit',nil);
SendMessage(h,WM_SETTEXT,255,Integer(PChar('我來測度了')));
ShowMessage( IntToStr(h));
end;orm

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

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;

 

http://www.cnblogs.com/snow001x/archive/2008/11/15/1334160.html

相關文章
相關標籤/搜索