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;
interface
uses windows, messages,tlhelp32, sysutils, classes, graphics, controls, forms, dialogs, stdctrls;
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));
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);
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);
hwnd: integer;
hwnd := findwindow('cabinetwclass',nil);
if hwnd<> 0 then
enumchildwindows(hwnd,@enumchildwindowsproc,longint(@buffer[0]));
caption := strpas(buffer);
end;