【问题标题】:C++ move mouse in windows using SetCursorPosC++ 使用 SetCursorPos 在窗口中移动鼠标
【发布时间】:2014-03-07 20:19:50
【问题描述】:

我创建了一个类似于 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);

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

【问题讨论】:

    标签: c++ windows mousemove sendinput


    【解决方案1】:

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

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

    这是在 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 解决了我的问题。现在我觉得自己很愚蠢。非常感谢:-)
    • 您应该使用 GetWindowRect 而不是 GetClientRect,因为 SetCursorPos 使用屏幕坐标。
    【解决方案2】:
    #include <Windows.h>
    
    int main()
    {
        SetCursorPos(200, 200);
        return 0;
    }
    

    【讨论】:

    • 这回答了标题问题,即如何移动鼠标。请注意,在问题的正文中,它询问为什么当某些程序(如任务管理器)集中SetCursorPos 不起作用时。接受的答案解释说,任务管理器之类的东西具有管理员权限,因此控制鼠标的程序也必须以管理员身份运行,鼠标控制才能工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2021-11-11
    • 2011-07-25
    相关资源
    最近更新 更多