天天看點

Delphi擷取句柄并發送消息!

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;

繼續閱讀