发新话题
打印

[SDK/API/系统] sendmessage实现点击其他程序上的按钮

sendmessage实现点击其他程序上的按钮

下面的代码是用QQ登录来作实验的。

procedure TForm1.Button3Click(Sender: TObject);
var
h,h1:THandle;
begin
   h:=findwindow(nil,'QQ用户登录');//h是登录窗口句柄
   if h<>0 then
   begin
   h1:=findwindowex(h,0,nil,'登录');//h1是登录按钮的句柄
   edit3.Text:=inttostr(h1);
   SENDmessage(h,WM_COMMAND,MAKELONG(GETDLGCTRLID(H1),BN_CLICKED),0);
   end
   else
   showmessage('false');
end;

程序实现的步骤是

首先查找QQ登录窗口的句柄,然后根据这个句柄在查找其窗口内名为“登录”的按钮的句柄。

这个时候就可以通过按钮的句柄对其进行操作。

这里主要在sendmessage的参数

我最早时候用sendmessage(h1,BN_CLICKED,0,0);

结果无效,后来才知道,BN_CLICKED是notification消息~ 必须要有ID……

使用sendmessage(h1,WM_LBUTTONDOWN,0,0);发送鼠标左键点击消息,也是无效不知道什么原因
妖城欢迎您!

TOP

关于makelong函数的解释

两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)   
  LONG   MAKELONG(   WORD   wLow,   WORD   wHigh   );
妖城欢迎您!

TOP

我们以前讲过选择菜单想也会发送WM_COMMAND 消息,那我们应如何区分呢?看了下表您就会一目了然:
  

                        Low word of wParam             High word of wParam                         lParam
Menu                            Menu ID                                   0                                        0
Control                         Control ID                       Notification code                  Child Window Handle
妖城欢迎您!

TOP

刚又发现……

实现按钮点击可以用两条消息来搞定

sendmessage(h,WM_LBUTTONDOWN,MK_LBUTTON,0);
sendmessage(h,WM_LBUTTONUP,0,0);

单用其中一个不行……

h为按钮的句柄

这样的效果也不错
妖城欢迎您!

TOP

发新话题