web-dev-qa-db-ja.com

C ++はSetCursorPosを使用してウィンドウ内でマウスを移動します

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を使用すると、次の1行になります。

SetCursorPos(posX, posY);

一部のプログラムで機能しない理由を誰かに教えてもらえますか?カーソルを制御するスマートフォンアプリを試してみて、すべてのプログラムで機能するので、これが可能でなければならないことはわかっています。

13
user3394180

プログラムよりも高い特権を必要とするウィンドウのカーソル位置または入力を設定することはできません。

プログラムでカーソルをタスクマネージャ上に移動できるようにするには、タスクマネージャと同じ特権、管理者特権が必要です。

これが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以降では、すべてのコンテキストメニューとウィンドウで同じです。タスクマネージャだけではありません。

12
Brandon
#include <Windows.h>

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