Postmessage的一个问题?(100分)

  • 主题发起人 主题发起人 archonwang
  • 开始时间 开始时间
A

archonwang

Unregistered / Unconfirmed
GUEST, unregistred user!
由于需要捕捉窗口的时候,要对窗口上一个确定的按钮进行3次的模拟点击操作(每次操作的结果不相同),但是发现对窗口的按钮消息捕捉之后,postmessage(i, bm_click, 0, 0)一运行procedure就结束了。不知道怎样才能实现让模拟点击实现多次?
请熟悉 windows api的兄弟帮忙。
 
SendMessage(button1.handle,WM_LBUTTONDOWN,MK_LBUTTON,0);
SendMessage(button1.handle,WM_LBUTTONUP,0,0);
 
楼上说的对,postmessage(i, bm_click, 0, 0)等于
postmessage(i, WM_LBUTTONDOWN, 0, 0)+postmessage(i, WM_LBUTTONDOWN, WM_LBUTTONUP, 0)

你也可以多发几个消息呀。具体不明白你的要求
 
我后来用了几个循环嵌套实现了功能,不过代码非常长,而且可读性很差。郁闷,所以想要有更简单的方法实现。
这个方案具体是这样子的:
有一套流程,需要用户点击3次的next按钮才能完成,我想让这个流程能够一键完成,(即实现用户不干预自动完成)。因为接口程序和调用程序不在同一个界面里,所以考虑使用api函数实现,但是在使用中发现,一旦在循环中碰到了postmessage语句结束后,就不再执行循环外下面的语句了?所以只好用了以下方式:
begin
if then begin
.....
if then begin
。。。。。
end;
end;
end;
 
对,那你改用SendMessage试一试,SendMessage要求消息执行完回调的。
 
已经驶过了。可以,但是又有新的问题了,使用了sendmessage是不是有限制?
我用
i:= findwindow(nil, '');
捕获不了窗口,是不是因为窗口没有名称所以不能捕获么?应该怎么捕获呢?

yostgxf:
昨天的函数驶过了
不行
 
我贴出有问题的代码:
if i <> 0 then
begin
//在这里循环取到想要的句柄为止
EnumChildWindows(i, @GetEditHandle, Integer(@i));
//此时,Handle就是你要的句柄
sendMessage(i, BM_Click, 0, 0);//捕获第一个按钮事件。
i := findwindow(nil, '工具');
if i <> 0 then
begin
EnumChildWindows(i, @GetEditHandle, Integer(@i));
sendmessage(i,bm_click,0,0);//捕获第二个按钮事件。
i := findwindow(nil, 'Form2'); //这里就不动了,不往下运行?
if i <> 0 then
begin
end;
 
begin
EnumChildWindows(i, @GetEditHandle, Integer(@i));
//你的i对吗?查一下
sendmessage(i,bm_click,0,0);//捕获第二个按钮事件。
//使用sendmessage如果消息不处理,不会往下执行
i := findwindow(nil, 'Form2'); //这里就不动了,不往下运行?
if i <> 0 then
begin
end;
 
SendMessage比PostMessage好,因为PostMessage送出消息后对方能否得到消息就不管了,而SendMessage特别认真,如果对方收不到消息非等不可,所以比较有把握。
还有,如果你要查找一个窗口上的按钮得先用FindWindow找出窗口句柄,然后再把这个handle代入查找按钮的FindWindow或者FindWindowEx函数中才可以。
procedure TForm23.Button4Click(Sender: TObject);
var
hwindow, hSubWindow:HWnd;
s: string;
begin
{此段代码演示查找OICQ窗口并发送信息}
//find main window
hwindow:=FindWindow('#32770','发送消息');
if hwindow <> 0 then
begin
//find RichEdit
hSubWindow:= FindWindowEx(hwindow, 0, PChar('RICHEDIT'), '');
if hSubWindow <> 0 then

begin
s:= '我最近发现个很好的网站,www.ok530.net';
SendMessage(hSubWindow, WM_SETTEXT, 0, LPARAM(s));
end else
ShowMessage('RichEdit not found!');
//change window text
SetWindowText(hwindow, PChar('哈哈!^_^!'));
end else
ShowMessage('QQ not opened!');
end;
 
sendmessage(i,bm_click,0,0);//捕获第二个按钮事件。
i := findwindow(nil, 'Form2'); //这里就不动了,不往下运行?
停止那里不动了是应为SendMessage发出消息后没有收到反馈信息,死等了!
改用PostMessage看看。
 
基本的原理现在总算清楚了。谢谢各位。
 
后退
顶部