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);
一部のプログラムで機能しない理由を誰かに教えてもらえますか?カーソルを制御するスマートフォンアプリを試してみて、すべてのプログラムで機能するので、これが可能でなければならないことはわかっています。
プログラムよりも高い特権を必要とするウィンドウのカーソル位置または入力を設定することはできません。
プログラムでカーソルをタスクマネージャ上に移動できるようにするには、タスクマネージャと同じ特権、管理者特権が必要です。
これが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;
}