使用mouse_event在C ++中无加速地移动鼠标

时间:2009-12-21 01:58:10

标签: c++ winapi

现在我尝试一个包含以下内容的循环:

mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);

鼠标往往移动超过(dx,dy)。在线研究,我认为这是因为操作系统加速了。如何将鼠标移动绝对量?

MOUSEEVENTF_ABSOLUTE似乎可能就是我想要的,但我看不出如何使用它。

我试过了:

mouse_event(MOUSEEVENTF_ABSOLUTE || MOUSEEVENTF_MOVE,dx,dy,0,0);

但这也不起作用。我更喜欢使用mouse_event而不是SetCursorPos或其他方法,我该怎么办?感谢。

2 个答案:

答案 0 :(得分:5)

坐标不是像素坐标,必须进行标准化。

#include <Windows.h>
#include <tchar.h>

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) {
  INPUT input = {0};

  int screenX = GetSystemMetrics( SM_CXVIRTUALSCREEN );
  int screenY = GetSystemMetrics( SM_CYVIRTUALSCREEN );

  for( unsigned int i = 0; i < 10; i++ ) {
    input.mi.dx = i*10 * ( 65535/screenX );
    input.mi.dy = i*10 * ( 65535/screenY );
    input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_MOVE;
    input.type = INPUT_MOUSE;

    SendInput( 1, &input, sizeof INPUT );
    Sleep( 1000 );
  }

  return ERROR_SUCCESS;
}

我在这里使用了SendInput()而不是mouse_event(),因为后者已根据文档被取代。如果你想将其转换回来,参数应该大致相同。

答案 1 :(得分:4)

来自winuser.h

#define MOUSEEVENTF_MOVE        0x0001
#define MOUSEEVENTF_ABSOLUTE    0x8000

MOUSEEVENTF_MOVE || MOUSEEVENTF_ABSOLUTE与评估为0x0001 || 0x8001的{​​{1}}相同,恰好是1!

使用true再次尝试,它可能会有效。

编辑: 在查看了一些文档之后,看起来你要么MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE所有。或者您需要考虑到它所寻找的值范围是0-65535在整个显示屏上缩放的事实。

  

如果指定了MOUSEEVENTF_ABSOLUTE值,则dx和dy包含0到65,535之间的归一化绝对坐标。事件过程将这些坐标映射到显示表面上。坐标(0,0)映射到显示表面的左上角,(65535,65535)映射到右下角。