模拟鼠标动作问题(300分)

  • 主题发起人 主题发起人 pengxiaolin
  • 开始时间 开始时间
P

pengxiaolin

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做个程序模拟鼠标动作,让系统响应。如让鼠标移到“我的电脑”图标上,单击左键,
系统响应单击事件,打开我的电脑,如同人手操作一样。不知如何做?一句话就是让程序
发鼠标单击消息给系统,让系统根据鼠标位置响应相应事件。手边没有参考书,请大家指
点。提供示例代码的给高分!
 
mouse_event(MOUSEEVENTF_MOVE+MOUSEEVENTF_ABSOLUTE,x,y,0, 0 );
mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0, 0 );
x,y坐标
 
同意胖的
鼠标移动使用第一个函数: mouse_event(MOUSEEVENTF_MOVE+MOUSEEVENTF_ABSOLUTE,x,y,0, 0 );
其中X, Y是屏幕的坐标。
鼠标左键单击(双击的话就执行两次 :)):
mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0, 0 );
mouse_event(MOUSEEVENTF_LEFTUP,x,y,0, 0 );
同理,右键,中键用下面的参数
MOUSEEVENTF_RIGHTDOWN Specifies that the right button changed to down.
MOUSEEVENTF_RIGHTUP Specifies that the right button changed to up.
MOUSEEVENTF_MIDDLEDOWN Specifies that the middle button changed to down.
MOUSEEVENTF_MIDDLEUP Specifies that the middle button changed to up.
滚轮滚动消息:
MOUSEEVENTF_WHEEL
拖动操作就是先执行DOWN,再MOVE,然后UP
明白?
 
给我邮件,我给你例子
 
对了, Microsoft建议使用SendInput来代替mouse_event等函数
用法也是差不多的。 只是把操作信息记录在一个Record里,然后再用SendInput发出。
 
在这里 http://www.8421.org/download.php?id=166&down=1 下载
 
这一问题在 win98 下已圆满解决!!!


procedure MoveToTarget(pTarget:TPoint);
var
p:TPoint;
i,n,dx,dy,mx,my,sx,sy:integer;
begin
n:=20;
windows.getcursorpos(p);
dx:=(pTarget.x-p.x) div 2;
dy:=(pTarget.y-p.y) div 2;
if dx>0 then sx:=1 else sx:=-1;
if dy>0 then sy:=1 else sy:=-1;

dx:=abs(dx);
dy:=abs(dy);

mx:=dx mod n;
dx:=dx div n;
my:=dy mod n;
dy:=dy div n;

mx:=mx*sx;
dx:=dx*sx;
my:=my*sy;
dy:=dy*sy;

mouse_event(MOUSEEVENTF_MOVE,mx,my,0,0);
for i:=1 to n do
begin
sleep(100);
mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);
end;
end;

//以下程序在 win98 下测试成功,分辨率为 800X600
//假设“开始”菜单的中心位置屏幕坐标为 (25,586)
//假设“我的电脑”图标的中心位置屏幕坐标为 (35,25)

// 移向开始菜单,并将它点开
procedure TForm1.Button1Click(Sender: TObject);
begin
MoveToTarget(point(25,586)); //移向开始菜单
sleep(500);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); //点击
mouse_event(MOUSEEVENTF_LEFTUP ,0,0,0,0);
end;

// 移向我的电脑,并将它打开
procedure TForm1.Button2Click(Sender: TObject);
begin
keybd_event(vk_lwin,0,0,0);
keybd_event(68,0,0,0);
keybd_event(68,0,KEYEVENTF_KEYUP,0);
keybd_event(vk_lwin,0,KEYEVENTF_KEYUP,0);

MoveToTarget(point(35,25)); //移向“我的电脑”
sleep(500);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); //点击
mouse_event(MOUSEEVENTF_LEFTUP ,0,0,0,0);
sleep(10);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); //形成双击
mouse_event(MOUSEEVENTF_LEFTUP ,0,0,0,0);
end;
 
呵呵,这几天出差了,没上来,这么多答案,多谢大家了。等我一一试来,确定谁的好,再
分配分数如何?
 
多人接受答案了。
 
后退
顶部