web-dev-qa-db-fra.com

C ++ déplacer la souris dans les fenêtres à l'aide de SetCursorPos

J'ai créé un appareil similaire à une wiimote et je veux l'utiliser comme souris dans Windows (8.1). Le périphérique se connecte via TCP à un programme Win32 c ++ sur mon ordinateur Windows et envoie la position où le curseur de la souris doit se déplacer. J'utilise la fonction SetCursorPos pour définir la position, ce qui fonctionne très bien pour contrôler la plupart des programmes. Mais quand j'essaye de contrôler par exemple le gestionnaire de tâches, le curseur ne bouge plus. Lorsque je repasse du gestionnaire de tâches à un autre programme, cela fonctionne à nouveau. J'ai également essayé d'utiliser la fonction SendInput avec les mêmes résultats.

Voici à quoi ressemble mon code avec 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));

Avec SetCursorPos, c'est juste une ligne:

SetCursorPos(posX, posY);

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas pour certains programmes? Je sais que cela doit être possible, car j'ai essayé une application pour smartphone qui contrôle le curseur et cela a fonctionné dans tous les programmes.

13
user3394180

Vous ne pouvez pas définir la position du curseur ou la saisie d'une fenêtre nécessitant des privilèges supérieurs à ceux de votre programme.

Si vous voulez que votre programme puisse déplacer le curseur sur le gestionnaire de tâches, vous avez besoin des mêmes privilèges que le gestionnaire de tâches: privilèges d'administrateur.

C'est ainsi que cela se fait sur Windows 8+.

Je l'ai essayé avec ce qui suit:

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;
}

Le curseur se déplace uniquement sur le gestionnaire de tâches lorsqu'il est exécuté en tant qu'administrateur. Il en va de même pour tous les menus contextuels et toutes les fenêtres de Windows 8+. Pas seulement le gestionnaire de tâches.

12
Brandon
#include <Windows.h>

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