本文以實例形式詳細說明了Delphi取得句柄並傳送訊息的方法,具體用法說明如下:
尋找另外一個視窗的句柄:
handle := FindWindow(nil,PChar('視窗的標題'));//查到窗體句柄
尋找子窗體:
childHandle := FindWindowEx(handle,0,'子窗體類別','子窗體標題');
另外有個枚舉子窗體的API,
EnumChildWindows(主創體句柄,@回呼函數,使用者參數);
用這個函數需要自己寫一個回呼的函數,例如:
function EnumChildProc(ahWND:HWND; param:LPARAM):boolean; stdcall;sendmessage(handle,message,wl,rl)
unit Unit1; end; var Form1: TForm1;implementation{ $R *.DFM}procedure TForm1.FormCreate(Sender: TObject);var a,b:PAnsiChar;h:HWND;beginh:= FindWindow(nil,'abc.txt - 記事本');h: = FindWindowEx(h,0,'edit',nil);SendMessage(h,WM_SETTEXT,255,Integer(PChar('我來測度了')));ShowMessage( IntToStr(h));end;
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 設定TV背景顏色SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0); 滑鼠左鍵按下SendMessage(Button.Handle,WM_LBUTTON, 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);
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;