在Windows中使用SetCursorPos移动鼠标的C++代码

21

我制作了一个类似于Wii遥控器的设备,希望将其用作Windows(8.1)中的鼠标。该设备通过TCP连接到我Windows计算机上的C++ Win32程序,并发送鼠标光标应移动的位置。我使用SetCursorPos函数设置位置,这对于控制大多数程序都很好用。但是当我尝试控制例如任务管理器时,光标就不再移动了。当我从任务管理器切换回其他程序时,它又能正常工作了。我也尝试使用SendInput函数,但结果相同。

以下是使用SendInput的代码:

INPUT Input = { 0 };
Input.type = INPUT_MOUSE;

Input.mi.dx = (LONG)posX;
Input.mi.dy = (LONG)posY;

// set move cursor directly
Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;

SendInput(1, &Input, sizeof(INPUT));

使用SetCursorPos只需要一行代码:

SetCursorPos(posX, posY);

有人可以告诉我为什么它对某些程序不起作用吗?我知道这是可能的,因为我试过一个智能手机应用程序,可以控制光标,并且在所有程序中都可以使用。

2个回答

21

如果您的程序权限不足,就无法设置光标位置或输入需要更高权限的窗口。

如果您希望程序能够在任务管理器上移动光标,您需要与任务管理器相同的特权:管理员权限。

以下是在Windows 8+上如何实现。

我使用以下内容尝试了一下:

int main()
{
    HWND window = FindWindow("TaskManagerWindow", "Task Manager");
    if (window)
    {
        RECT rect = {0};
        GetWindowRect(window, &rect);

        SetForegroundWindow(window);
        SetActiveWindow(window);
        SetFocus(window);
        Sleep(300);
        SetCursorPos(rect.right - 200, rect.bottom - 200);
    }

    return 0;
}

只有以管理员身份运行时,光标才能在任务管理器上移动。这适用于Windows 8+中的所有上下文菜单和窗口,而不仅仅是任务管理器。


好的,以管理员身份运行Visual Studio解决了我的问题。现在我感到很愚蠢。非常感谢您 :-) - user3394180
3
由于SetCursorPos使用屏幕坐标,所以应该使用GetWindowRect而不是GetClientRect。 - Benjamin Xu

21
#include <Windows.h>

int main()
{
    SetCursorPos(200, 200);
    return 0;
}

4
这回答了标题问题,即如何移动鼠标。注意,在问题正文中,它问道为什么当某些程序(如任务管理器)处于聚焦状态时,“SetCursorPos”不起作用。被接受的答案解释了像任务管理器这样的程序具有管理员权限,因此控制鼠标的程序也必须以管理员身份运行才能使鼠标控制起作用。 - tscizzle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接