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

相关文档
最新文档