C++ перемещение мыши в windows с помощью SetCursorPos

Я создал устройство, похожее на wiimote, и я хочу использовать его как мышь в windows (8.1). Устройство подключается по tcp к программе c++ win32 на моем компьютере с windows и отправляет положение, в котором должен перемещаться курсор мыши. Я использую функцию 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 ответов


вы не можете установить позицию курсора или ввод окна, для которого требуются более высокие права, чем у вашей программы..

Если вы хотите, чтобы ваша программа могла перемещать курсор над диспетчером задач, вам требуются те же права, что и у диспетчера задач: права администратора.

вот как это делается в 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+. Не только Диспетчер задач.


#include <Windows.h>

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