19

wiimote に似たデバイスを作成しました。これを Windows (8.1) でマウスとして使用したいと考えています。デバイスは tcp 経由で Wi​​ndows コンピューターの 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);

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

4

2 に答える 2

20

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

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

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

于 2014-03-07T20:46:32.323 に答える
18
#include <Windows.h>

int main()
{
    SetCursorPos(200, 200);
    return 0;
}
于 2016-11-07T09:17:19.200 に答える