如何在C ++中的任何可能的点移动光标?

时间:2018-03-28 12:14:34

标签: c++ winapi mouseevent

当我按TAB键

时,我编写了以下代码以将鼠标移动到屏幕上的任何位置
#define WINVER 0x0500
#include <windows.h>
#include <Winuser.h>

int main() {

while(true) {

//mi0 to move mouse to top left corner of screen
INPUT mi0[1] = {0};

mi0[0].type = INPUT_MOUSE;
mi0[0].mi.dx = -99999; // desired X coordinate
mi0[0].mi.dy = -99999; // desired Y coordinate
mi0[0].mi.dwFlags = MOUSEEVENTF_MOVE;

//mi1 to move mouse and click
INPUT mi1[3] = {0};

mi1[0].type = INPUT_MOUSE;
mi1[0].mi.dx = 1; // desired X coordinate
mi1[0].mi.dy = 1; // desired Y coordinate
mi1[0].mi.dwFlags = MOUSEEVENTF_MOVE;

mi1[1].type = INPUT_MOUSE;
mi1[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

mi1[2].type = INPUT_MOUSE;
mi1[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;

if (GetKeyState(VK_TAB) & 0x8000 ) {
Sleep(300);
SendInput(1, mi0, sizeof(INPUT));
Sleep(300);
SendInput(3, mi1, sizeof(INPUT));
}}}

除了dy和dx只能是整数,并且像1.9或1.1这样的值被读为1时,这种方法工作正常,因为它占据了很长的移动长度,所以我基本上只限于屏幕上的一些点。如何解决此问题并将鼠标移动到屏幕上的任何位置。我使用Notepad ++和MinGW,以防任何可能相关的情况。任何帮助/指导非常感谢。提前谢谢。

1 个答案:

答案 0 :(得分:2)

与Y.S一样,请检查MOUSEEVENTF_ABSOLUTE和MOUSEMOVEPOINT。

dwFlags改变了dx和dy的含义。但你永远不需要浮动价值。

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

如果未设置此标志,则鼠标移动前一个位置的dx像素和dy像素。

来自: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx