19

我创建了一个类似于 wiimote 的设备,我想将它用作 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);

谁能告诉我为什么它不适用于某些程序?我知道它必须有可能做到这一点,因为我尝试了一个控制光标的智能手机应用程序,它适用于所有程序。

4

2 回答 2

20

您不能设置需要比程序具有更高权限的窗口的光标位置或输入。

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

这就是它在 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+ 中的所有上下文菜单和窗口都是一样的。不仅仅是任务管理器。

于 2014-03-07T20:46:32.323 回答
18
#include <Windows.h>

int main()
{
    SetCursorPos(200, 200);
    return 0;
}
于 2016-11-07T09:17:19.200 回答