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,' - 记事本');
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_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 ⼀个窗⼝获得焦点
delphi app★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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论