c++模拟鼠标事件

原创 2011年01月10日 14:09:00

c++模拟鼠标事件,一般可以通过mouse_event()和SendInPut()两种方法。mouse_event()在windows后期版本中逐渐被SendInPut()取代。SendInPut()模拟鼠标移动的事件中,标志位取值不同,输入坐标的意义也不同。简单来说就是,添加MOUSEEVENTF_ABSOLUTE标志位表示鼠标移动是通过绝对坐标定位,此时的坐标要通过转换。光标在屏幕中被分成65535个小块,可以通过如下转换:

  double fx = x*(65535.0f/fScreenWidth);
  double fy = y*(65535.0f/fScreenHeight);

若不使用MOUSEEVENTF_ABSOLUTE标志位,则坐标是相对前一坐标的位移。

SendInPut()鼠标事件使用如下结构:

typedef struct tagMOUSEINPUT {
  LONG      dx;
  LONG      dy;
  DWORD     mouseData;
  DWORD     dwFlags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT;

 

msdn中完整解释如下:

dx

Type: LONG

The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the dwFlags member. Absolute data is specified as the x coordinate of the mouse; relative data is specified as the number of pixels moved.

dy

Type: LONG

The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the dwFlags member. Absolute data is specified as the y coordinate of the mouse; relative data is specified as the number of pixels moved.

 

以下是摘自网络上的一段FAQ,代码演示了鼠标的几个具体操作。

Q: How can I emulate mouse events in an application?

A:

  • There are two API fucntions that you can use:


  • Which of the two API functions should I use?

    The 'mouse_event()' function has been superseded by 'SendInput()' on Window NT/2000/XP. Thus, on these operating systems you should use 'SendInput()' (unless you need to provide backward compatibility with Windows 98 etc.). This FAQ is based on 'SendInput()'.

  • Can I see some example on how to use 'SendInput()' to emulate a click with the left mouse button?


    Code:

    void LeftClick ( )

      INPUT    Input={0};
      // left down
      Input.type      = INPUT_MOUSE;
      Input.mi.dwFlags  = MOUSEEVENTF_LEFTDOWN;
      ::SendInput(1,&Input,sizeof(INPUT));

      // left up
      ::ZeroMemory(&Input,sizeof(INPUT));
      Input.type      = INPUT_MOUSE;
      Input.mi.dwFlags  = MOUSEEVENTF_LEFTUP;
      ::SendInput(1,&Input,sizeof(INPUT));
    }
  • How to use the function?


    Code:
    LeftClick();
    The left click will be performed on the current position of the mouse cursor.

  • Can I see some example on how to use 'SendInput()'
    to emulate a click with the right mouse button?


    Code:

    void RightClick ( )

      INPUT    Input={0};
      // right down
      Input.type      = INPUT_MOUSE;
      Input.mi.dwFlags  = MOUSEEVENTF_RIGHTDOWN;
      ::SendInput(1,&Input,sizeof(INPUT));

      // right up
      ::ZeroMemory(&Input,sizeof(INPUT));
      Input.type      = INPUT_MOUSE;
      Input.mi.dwFlags  = MOUSEEVENTF_RIGHTUP;
      ::SendInput(1,&Input,sizeof(INPUT));
    }
  • How to use the function?


    Code:

    RightClick();
    The right click will be performed on the current position of the mouse cursor.

  • Can I see some example on how to use 'SendInput()' for emulating mouse movement?


    Code:

    void MouseMove (int x, int y )

      double fScreenWidth    = ::GetSystemMetrics( SM_CXSCREEN )-1;
      double fScreenHeight  = ::GetSystemMetrics( SM_CYSCREEN )-1;
      double fx = x*(65535.0f/fScreenWidth);
      double fy = y*(65535.0f/fScreenHeight);
      INPUT  Input={0};
      Input.type      = INPUT_MOUSE;
      Input.mi.dwFlags  = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
      Input.mi.dx = fx;
      Input.mi.dy = fy;
      ::SendInput(1,&Input,sizeof(INPUT));
    }
  • How to use the function?


    Code:

    MouseMove(100,100);
    This call will move the mouse cursor to the position 100/100 on the screen.



Thanks to cilu for helping writing this FAQ.

C++模拟鼠标点击

这种东西我在网上查了一下,貌似有很多,但是都是零零散散的 没有什么好说的,一共就两句话 mouse_event(MOUSEEVENTF_XDOWN,0,0,0,0); mouse_event(MOUS...

c++鼠标操作详解

鼠标作为一种定位输入设备在Windows中得到了广泛的应用,通过鼠标的单击、双击功能和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。Windows中通过光标来指示当前鼠标的位置,...

使用API函数mouse_event可以模拟鼠标事件

使用API函数mouse_event可以模拟鼠标事件 使用API函数mouse_event可以模拟鼠标;先在程序中加入如下的声明后,就能引用mouse_;PrivateD...

linux c/c++监听鼠标或键盘事件

linux c/c++监听鼠标或键盘事件 1、输入设备在文件/proc/bus/input/devices中,如: 其中Handlers=kbd event2,说明其值可以在/dev/in...

模拟鼠标事件的实现思路及代码

c++控制台程序代码如下: -------------------------------------------------------------------------------------...

C++实现鼠标控制 封装常见的模拟鼠标、键盘的操作函数

API 或 MFC 视窗程序 里 有 函数, 例如 API 函数 设位置: BOOL SetCursorPos( int x, int y); 参数是屏幕坐标x,y 头文件 Winuse...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

控制台模拟鼠标、键盘操作

控制台模拟鼠标、键盘操作  模拟鼠标、键盘操作,能让命令行顿然强大,想想,制作批处理版屏幕键盘等都不在话下(已制作过,效果很不错)。虽然这也跟CUI无关。本教程教会你如何让命令行模拟鼠标、键盘的操作...
  • a199228
  • a199228
  • 2011年08月18日 00:22
  • 7071

C# Win32API 模拟鼠标移动及点击事件

C# Win32API 模拟鼠标移动及点击事件
  • wyq1153
  • wyq1153
  • 2016年11月03日 21:13
  • 2301

触摸屏 触摸操作 鼠标点击事件

环境:window 语言:C++ 触摸屏 触摸操作实现。通过鼠标左键或者右键点击事件,获取首尾点坐标(down时获取首点坐标,up时获取尾点坐标),计算x、y距离差值。根据差值判断移动方向。 代码: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++模拟鼠标事件
举报原因:
原因补充:

(最多只允许输入30个字)