Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ move mouse in windows using SetCursorPos

I created a device similar to a wiimote and i want to use it as a mouse in windows (8.1). The device connects over tcp to a c++ win32 program on my windows computer and sends the position where the mouse cursor should move. I am using the SetCursorPos function to set the position, which works great to control most programs. But when I try to control for example the task manager, the cursor doesn't move anymore. When I switch from the task manager back to some other program it works again. I also tried to use the SendInput function with the same results.

This is what my code looks like with 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));

With SetCursorPos it's just one line:

SetCursorPos(posX, posY);

Can anybody tell me why it doesn't work for some programs? I know it has to be possible to do this, since I tried a smartphone app which controls the cursor and it worked in all programs.

like image 800
user3394180 Avatar asked Mar 07 '14 20:03

user3394180


People also ask

Can a macro move your mouse?

This option instructs the macro to move the mouse cursor relative to its position on the computer screen. Use the "Screen Coordinates" numbers from the Mouse Locator with this option. This option instructs the macro to move the mouse cursor relative to its position within the window that is active.


1 Answers

You cannot set the cursor position or input of a window that required higher privileges than your program has..

If you want your program to be able to move the cursor over task manager, you require the same privileges as task manager: Administrator Privileges.

This is how it is done on Windows 8+.

I tried it with the following:

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

Cursor only moves over task manager when ran as admin. It is the same for all context menus and windows in Windows 8+. Not just task manager.

like image 186
Brandon Avatar answered Oct 01 '22 17:10

Brandon