关于后台鼠标点击(200)

  • 主题发起人 主题发起人 xiangxingzi
  • 开始时间 开始时间
X

xiangxingzi

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在程序中,后台运行中,鼠标点击其他的程序上的某个区域(不一定是Button区域);测试了扫雷程序的就可以(因为上面都是Button),非Button区域就不可以,比如计算器程序(calc.exe),(扫雷的非Button区域点击也是无效)。是不是sendmessage的参数设置需要更改??请问哪位高手能解决这个问题,不胜感激!!var Wnd: HWND;begin Wnd := FindWindow(nil,'扫雷'); //找到Delphi IDE 的 handle if Wnd <> 0 then begin SetForegroundWindow(Wnd); SendMessage(Wnd, WM_LBUTTONDOWN,0, MakeLParam(100,200)); SendMessage(Wnd, WM_LBUTTONUP, 0, MakeLParam(100,200)); end else ShowMessage('window not found');end;
 
没有大侠会吗??
 
要么换一个事件看看?是不是其它的不支持这两个事件??
 
SendMessage(Wnd, WM_LBUTTONDOWN,0, MakeLParam(100,200));我测试了 多个外部程序,这个消息,只对Button区域起作用,不知道应该怎么修正参数~!! 望大虾出招啊!!!!!!
 
这个容易解决!用ScreenToClient将坐标转为目标程序上的坐标即可。刚刚自己亲自测试过,点击一张图标的某个坐标,没发现有什么问题。
 
getmoney,您好! 能具体写一下吗,比如:我想点击 “计算器(calc.exe)”程序里的 3*7= 四个按键,如何写代码??
 
想点击 “计算器(calc.exe)”程序里的 3*7= 四个按键是不难实现的。它不也是按钮吗?
 
试试下面的代码:unit Unit1;interfaceuses Windows, SysUtils, Messages, Classes, Controls, Forms, StdCtrls;type TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; I3, I, I7, Ir: Integer;implementation{$R *.dfm}function EnumChildWindowsProc(lHwnd, lParam: Integer): Boolean; stdcall;var Caption: array[0..254] of Char; ClassName: array[0..254] of Char;begin GetWindowText(lHwnd, @Caption, 254); GetClassName(lHwnd, @ClassName, 254); if StrPas(ClassName) = 'Button' then begin if Caption = '3' then I3 := lHwnd; if Caption = '*' then I := lHwnd; if Caption = '7' then I7 := lHwnd; if Caption = '=' then Ir := lHwnd; end; Result := True;end;procedure TForm1.btn1Click(Sender: TObject);var wHandle: HWND; szText: array[0..254] of Char;begin wHandle := GetWindow(Handle, GW_HWNDFIRST); while (wHandle <> 0) do begin if GetWindowText(wHandle, @szText, 255) > 0 then if StrPas(@szText) = '计算器' then // 根据目标窗体的标题查找该窗体句柄 begin EnumChildWindows(wHandle, @EnumChildWindowsProc, 0); // 枚举目标窗体的控件 Break; end; wHandle := GetWindow(wHandle, GW_HWNDNEXT); end; SendMessage(I3, WM_LBUTTONDOWN, 0, 0); SendMessage(I3, WM_LBUTTONUP, 0, 0); SendMessage(I, WM_LBUTTONDOWN, 0, 0); SendMessage(I, WM_LBUTTONUP, 0, 0); SendMessage(I7, WM_LBUTTONDOWN, 0, 0); SendMessage(I7, WM_LBUTTONUP, 0, 0); SendMessage(Ir, WM_LBUTTONDOWN, 0, 0); SendMessage(Ir, WM_LBUTTONUP, 0, 0);end;end.
 
楼上正解~ to:楼主XP自带的计算器,全是button啊。。。这个就更加容易了。SendMessage(Btn,BM_CLICK,0,0); 就可以了
 
SendMessage(findwindow('扫雷','扫雷'), WM_LBUTTONDOWN, 0, MakeLParam(52, 107)); //鼠标按下 sendMessage(findwindow('扫雷','扫雷'), WM_LBUTTONUP, 0, MakeLParam(52, 107)); // 鼠标抬起打开扫雷游戏后,测试这2句代码,不行的话你找我。 亲测。我都说过坐标必须用ScreenToClient转换一下。
 
不好意思,可能我举的计算器的例子有点问题,我要点的外部程序的区域肯定不是button; 比如,一个外部程序里调用的是个flash文件,内部某个地方我需要点击~(根本没可能得到控件句柄),我能否得到外部程序的内部某个区域对应的坐标位置,只执行一个鼠标按下的操作,就可以完成呢?就是 mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0, 0 ); mouse_event(MOUSEEVENTF_LEFTUP,x,y,0, 0 ); 这样的执行效果。但是希望在不影响别的程序的情况下,后台操作~!! 先谢谢大家了!!麻烦getmoney,szhcracker二位了,分我不会吝惜的,放心!!http://www.delphibbs.com/delphibbs/dispq.asp?lid=3988006 这里的分一并给出!!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
608
import
I
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
976
import
I
D
回复
0
查看
661
DelphiTeacher的专栏
D
后退
顶部