C++ 使用 SetCursorPos 在窗口中移动鼠标

标签 c++ windows mousemove sendinput

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

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

最佳答案

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

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

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

关于C++ 使用 SetCursorPos 在窗口中移动鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22259936/

相关文章:

c++ - Windows 服务写入 Windows TEMP 文件夹

Windows批处理文件复制并保留重复项

c# - 在关闭应用程序时停止在 C# 中启动的命令行进程

c++ - 哪个范围循环(auto,auto&,const auto&)在c++ 11中更有效

c++ - 为什么我的 VC 2005 x64 调试 session 在第一次试用时总是失败(但在第二次试用时却没有)?

c++ - 如何让cmake找到CUDA

windows - 如何阻止 Golang 在执行 Windows 命令时用反斜杠替换双引号?

用于将长 URL 滑入 View 的 jQuery mousemove 动画

jquery - 带有 mousemove 的交互式背景 mask (jQuery、CSS)

JavaScript - iPad/iPhone 上未触发 mousemove 事件