Windows操作系统中程序间消息的应用
总第82期张明:Windows操作系统中程序问消息的应用
procedureTForml.ButtonlClick(Sender:TObjeet);
vsr
。h:HWND;
k酒n
h:=findwindow(0,’TencentMessenger’);//以访问腾讯TM为例
ifh<>0then
begin
enumchildwindows(h,@proc,0);
end’
else
showmessage(’请先运行TM登录程序!’);end;
程序运行效果如下(如图1所示):
图1枚举子窗体运行界面
如果确定获取某一窗口的句柄,也可以通过鼠标位置来获取.此时需要WindowFrom-Point()函数来实现.
例如:’procedure
TFo衄I.FormMouseMove(Sender:TOb—jeet;Shift:TShiftState;X,
Y:Integer);
begin
geteursorpos(tp);
hd:=WindowFromPoint(tp);
ifhd=0thenforml.caption:;’捕获窗体句柄不成功’;
end;
procedureTFo瑚I.FormMouseUp(Sender:TObject;Button:TMouseButton;
Shift:TShiftState;X,Y:Integer);
vat
fitle:string;
classnamel,tiflel:array[O..z55]ofehox;
姊n
setlength(title,100);
StaticText4.Caption:=inttostr(hd);
sendmessage(hd,WM-Gl玎脚,100,integer(ti-tie));、
iftitle=”then
begin
getwindowtext(hd,tithl,100);
StatieText5.Caption::fiflel;
end
else
StaticText5.Caption:=fide;
70
长沙大学学报2008年3月
getclassname(hd,elassnamel,255);StatieText6.Caption:=classnamel;end;
程序运行效果如下图(如图2所示):
图2获取鼠标所指窗口句柄等信息
(2)向其他进程发送消息
根据上例获取所需要的窗口句柄后,程序员即
可对其发送消息,此时需通过SendMessage()或
Post_Message()来完成.
SendMessage将指定的消息发送到一个或多个窗口,此函数为指定的窗口调用窗口程序,直到窗口
程序处理完消息再返回.而函数Post_Message不同,
将一个消息寄送到一个线程的消息队列后立即返回.本例采用SendMessage()来向其发送消息.+Send_Message(hWnd:HWND,Msg:UINT,wParam:WPARAM,IParam:LPARAM):I_BESULT;
hWnd:其窗口程序将接收消息的窗口的句柄.
如果此参数为HWND—BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非白.身拥有的窗口、被覆盖的窗口和弹出式窗口,但不被发送到子窗口.
Msg:指定被发送的消息.
wParam:指定附加的消息指定信息.
IParam:指定附加的消息指定信息.
返回值:返回值指定消息处理的结果,依赖于所发送的消息.
如果指定的窗口是由调用线程创建的,则窗口
程序立即作为子程序调用.如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序.线程间的消息只有在线程执行消息检索代码时才被处理.发送线程被阻塞直到接收线程处理完消息为止.
通过上例获取到某程序登录界面各子窗口句柄后,可通过向用户名、口令文本框以及提交按钮发送消息来实现自动登录.
在回调函数中可通过ClassName或TitleName来确定,用户名的输入框一般为TEdit或TComboBox类,如果为后者,一般均有下拉列表供选择,口令的输入框一般为TEdit类,而登录按钮一般为TButton类,并且可通过其TitleName组合确定.
var
Forml:TForml;
ButtonDown:integer;//定义一个全局变量,用来存储按钮句柄
implementation
{¥R*.dfm}
functionproc(h:hwnd;l:LParam):bool;stdcaU;
val"
,一
classnan砣,titlename:a珊y[O..255]ofchar;
begin
ifcla¥snalTlte=’TEdit’thensendmessage(h,WM—SVITEXT,0,LPARAM(forml.Editl.Text));
//为Edit设置文本内容
iftitlename=’登录’thenButtonDown:=h;
//为防止先枚举到按钮,可先将其句柄保留下
来
Windows操作系统中程序间消息的应用
作者:张明
作者单位:长沙大学电子与通信工程系,湖南,长沙,400003
刊名:
长沙大学学报
英文刊名:JOURNAL OF CHANGSHA UNIVERSITY
年,卷(期):2008,22(2)
参考文献(2条)
1.同志工作室Delphi5 API函数开发实例 2001
2.孙鑫VC 讲座笔记--WINDOWS 程序内部运行原理
本文链接:https://www.360docs.net/doc/667543218.html,/Periodical_csdxxb200802022.aspx