现在我尝试一个包含以下内容的循环:
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或其他方法,我该怎么办?感谢。
答案 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)映射到右下角。