zoukankan      html  css  js  c++  java
  • VC模拟鼠标的两种方式(SendMessage、mouse_event)

    鼠标模拟的常用方案,包括发送鼠标事件消息和使用mouse_event系统函数,发送鼠标消息的例子如下:

    pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);

    这种方法不需要窗体在前端,甚至最小化也可以使用,但是此方法并不是在所有场合有效,特别是对于不响应鼠标消息的程序更是如此。在这种情况下,可以尝试使用mouse_event函数。
    首先给出mouse_event函数的原型:

    VOID mouse_event(      
    
        DWORD dwFlags,
        DWORD dx,
        DWORD dy,
        DWORD dwData,
        ULONG_PTR dwExtraInfo
    );

    mouse_event有五个参数,第 一个为选项标志,为MOUSEEVENTF_LEFTDOWN时表示左键按下为MOUSEEVENTF_LEFTUP表示左键松开,向系统发送相应消息;第二、三个参数分别表示模拟鼠标对应x,y的位置,需要注意测是该参数对应的是屏幕坐标;第四、五个参数并不重要,一般也可设为0,0。若要得到Keybd_event和mouse_event函数的更详细的用法,可以查阅msdn。
    mouse_even只能够发送前台消息,即仅对当前激活的窗体有效。t最好配合SetCursorPos(x,y)函数一起使用,首先调用SetCursorPos函数设置鼠标位置到需要模拟鼠标操作的位置,然后调用mouse_event模拟鼠标操作,下面是关于mouse_event的示例代码:

    POINT lpPoint;
    GetCursorPos(&lpPoint);
    SetCursorPos(lpPoint.x, lpPoint.y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    示例代码表示鼠标的双击,若要表示单击,用两个mouse_event即可(一次放下,一次松开)。

    上面说明了模拟鼠标操作的两种常用方法,下面再给出一个综合实例进行阐述说明:

    //在发送按键消息前需要设置下鼠标位置,扫雷程序似乎是根据鼠标位置
    //确定点击的方块的,而不是鼠标消息的参数
    //所以PostMessage在这里也不可以使用
    ::SetCursorPos(x,y);
    //判断是否是雷,不是雷才执行鼠标点击动作
    if(MineInf[acol*row+arow]==1){
        /*::mouse_event(MOUSEEVENTF_RIGHTDOWN,x,y,0,0);
        ::mouse_event(MOUSEEVENTF_RIGHTUP,x,y,0,0);	*/
        pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);
        pWnd->SendMessage(WM_RBUTTONUP,0,(y<<16)|x);
    }else{
        /*::mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
        ::mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);*/				
        pWnd->SendMessage(WM_LBUTTONDOWN,0,(y<<16)|x);
        pWnd->SendMessage(WM_LBUTTONUP,0,(y<<16)|x);
    }				

    好了,这就是目前使用最多的VC程序进行鼠标事件模拟的两种方案,读者可以根据实际情况选择使用。

  • 相关阅读:
    thinkpa R61i安装XP SATA的解决方法
    成都港宏4S店买的日产,送的无牌DVD 和可视倒车品牌是路特仕 80007
    设计模式之:解剖观察者模式
    java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)
    lephone 壁纸(裸婚时代 童佳倩姚笛壁纸)
    C# 让程序自动以管理员身份运行
    项目管理的5大过程组、9大知识域、44个管理流程的映射关系
    Spring Security 中如何让用户名不存在的错误显示出来(用户名不存在显示Bad credentials)
    eclipse老是报ThreadPoolExecutor$Worker.run()
    Unison文件夹同步工具
  • 原文地址:https://www.cnblogs.com/wolly88/p/4278487.html
Copyright © 2011-2022 走看看