[请教]HOOK 和 模拟鼠标双击

wwfttelne 2003-12-07 09:28:25
在别人的应用程序中,我想模拟一下鼠标双击功能。
下面是我想到的代码:
POINT point;
GetCursorPos (&point);
mouse_event(MOUSEEVENTF_LEFTDOWN,point.x ,point.y ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP ,point.x ,point.y ,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,point.x ,point.y ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP ,point.x ,point.y ,0,0);

不过效果好象不对,感觉上象只单击了一次。
为什么会这样呢?

另外,我在模拟鼠标和键盘的时候,常常出现下面这种情况:
选中一个 EDIT 框中的文本
模拟单击 Delte 键
然后 SetWindowsText "123"

可是 效果确实 "23"
如果 SetWindowsText "1123"
这个时候的效果为: "123"

似乎这里面有一种延迟。
我们想要做的,和应用程序自己处理的有一种不一致。
不知道到该如何解决?
请高手指点一下。

谢谢先!

...全文
235 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ross33123 2003-12-08
  • 打赏
  • 举报
回复
mouse_event 和 keybd_event 模拟的是鼠标和键盘事件,必须经过消息队列才能被应用程序处理。

而SetWindowText直接通过 SendMessage 调用相应的窗口过程,当然会先于 Del
ross33123 2003-12-08
  • 打赏
  • 举报
回复
模拟鼠标双击,最大化 NOTEPAD 窗口

STARTUPINFO startInfo = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION procInfo;
::CreateProcess(NULL, "NOTEPAD.EXE", NULL, NULL, FALSE, 0, NULL, NULL,
&startInfo, &procInfo);
::WaitForInputIdle(procInfo.hProcess, 3000);
HWND hwnd = ::FindWindow("NOTEPAD", NULL);
CRect rc;
::GetWindowRect(hwnd, rc);

// 我的分辨率是 1024*768,请改为自己的分辨率
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,
(rc.left+100)*65535/1024, (rc.top+10)*65535/768, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0 ,0 ,0,0);
yangsiwei 2003-12-08
  • 打赏
  • 举报
回复
两次单击当中要用Sleep睡一下
下面的也是
ross33123 2003-12-08
  • 打赏
  • 举报
回复
SendIuput确实是WIN 32 API,可以取代 keybd_event 和 mouse_event,不过用起来稍麻烦一些。当然也有它的好处,可以产生一系列连续的事件,不用担心中间插入其他事件。
ross33123 2003-12-08
  • 打赏
  • 举报
回复
代码测试过,不过里面具体数值可能要调整

mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,
(rc.left+100)*65535/1024, (rc.top+10)*65535/768, 0, 0);

这里假定 NOTEPAD 窗口左上角向右 100 向下 10 处是标题栏
并假定分辨率是 1024 * 768

可以用 ::GetSystemMetrics 写比较通用的代码,这里只是为简便起见用了常量
wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
SendIuput是WIN 32 API 吗?
感觉像是DirectX API
wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
第二个问题解决了,用的是ross提供的办法。EM_REPLACESEL

不过双击还是没有成功。

ross,你对你上面写的例子很确定吗?
另外,例子当中,在x,y值上都设为 0,这样正确吗?
也是表示原地点击的意思吗?
ross33123 2003-12-08
  • 打赏
  • 举报
回复
模拟双击上面的例子已经说得很清楚了

至于第二个问题,你应该或者都用直接的窗口调用(模拟DEL改为发送EM_REPLACESEL),或者都用模拟事件,把 SetWindowText改为一连串 keyb_event
checkyvc6 2003-12-08
  • 打赏
  • 举报
回复
SendInput()应该可以考虑一下
单击游戏外挂就这样写的
wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
实话说,sleep的作用不大。
ross给出的例子里面,好像也没有sleep.

不知道多线程技术可不可以帮忙。
wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
关于双击,我感觉有可能和我想HOOK的应用程序有关系。
实话说,我想HOOK的是FLASH 5.0
哈哈,至于为什么,我不想在这里说了。
我准备把这个话题结了。
对了,rose,谢谢你的帮助。
我的QQ: 171126287
e-mail: biqiong2002@sina.com
有空找我聊天。
wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
我查了一下自己经常用的WIN 32 帮助文件,没有找到SendInput
不过,我在VC 6.0里面可以调用这个函数。
看来我的帮助文件在内容上不够全面了。

wwfttelne 2003-12-08
  • 打赏
  • 举报
回复
我说的是下面这四行代码:
mouse_event(MOUSEEVENTF_LEFTDOWN, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0 ,0 ,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0 ,0 ,0,0);
里面关于鼠标坐标全部设置为0
这样表示原地点击,是吗?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧