在别人的应用程序中,我想模拟一下鼠标双击功能。
下面是我想到的代码:
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"似乎这里面有一种延迟。
我们想要做的,和应用程序自己处理的有一种不一致。
不知道到该如何解决?
请高手指点一下。谢谢先!

解决方案 »

  1.   

    两次单击当中要用Sleep睡一下
    下面的也是
      

  2.   

    模拟鼠标双击,最大化 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);
      

  3.   

    mouse_event 和 keybd_event 模拟的是鼠标和键盘事件,必须经过消息队列才能被应用程序处理。而SetWindowText直接通过 SendMessage 调用相应的窗口过程,当然会先于 Del
      

  4.   

    实话说,sleep的作用不大。
    ross给出的例子里面,好像也没有sleep.不知道多线程技术可不可以帮忙。
      

  5.   

    SendInput()应该可以考虑一下
    单击游戏外挂就这样写的
      

  6.   

    模拟双击上面的例子已经说得很清楚了至于第二个问题,你应该或者都用直接的窗口调用(模拟DEL改为发送EM_REPLACESEL),或者都用模拟事件,把 SetWindowText改为一连串 keyb_event
      

  7.   

    第二个问题解决了,用的是ross提供的办法。EM_REPLACESEL不过双击还是没有成功。ross,你对你上面写的例子很确定吗?
    另外,例子当中,在x,y值上都设为 0,这样正确吗?
    也是表示原地点击的意思吗?
      

  8.   

    SendIuput是WIN 32 API 吗?
    感觉像是DirectX API
      

  9.   

    代码测试过,不过里面具体数值可能要调整    mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,
            (rc.left+100)*65535/1024, (rc.top+10)*65535/768, 0, 0);这里假定 NOTEPAD 窗口左上角向右 100 向下 10 处是标题栏
    并假定分辨率是 1024 * 768可以用 ::GetSystemMetrics 写比较通用的代码,这里只是为简便起见用了常量
      

  10.   

    SendIuput确实是WIN 32 API,可以取代 keybd_event 和 mouse_event,不过用起来稍麻烦一些。当然也有它的好处,可以产生一系列连续的事件,不用担心中间插入其他事件。
      

  11.   

    我说的是下面这四行代码:
    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
    这样表示原地点击,是吗?
      

  12.   

    我查了一下自己经常用的WIN 32 帮助文件,没有找到SendInput
    不过,我在VC 6.0里面可以调用这个函数。
    看来我的帮助文件在内容上不够全面了。