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

Dav*_*e61 2 c++ winapi

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

mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);
Run Code Online (Sandbox Code Playgroud)

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

MOUSEEVENTF_ABSOLUTE似乎可能正是我正在寻找的,但我看不出如何使用它.

我试过了:

mouse_event(MOUSEEVENTF_ABSOLUTE || MOUSEEVENTF_MOVE,dx,dy,0,0);
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*wan 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;
}
Run Code Online (Sandbox Code Playgroud)

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