6

WM_INPUTメッセージをアプリケーションに送信しようとしていますが、解決できないいくつかのハードルに遭遇します。次のようなRAWINPUT構造を作成しました。

//try sending 'W'
    RAWINPUT raw = {0};
    char c = 'W';
    //header
    raw.header.dwSize = sizeof(raw);
    raw.header.dwType = RIM_TYPEKEYBOARD;
    raw.header.wParam = 0; //(wParam & 0xff =0 => 0)
    raw.header.hDevice = hDevice;

    //data
    raw.data.keyboard.Reserved = 0;
    raw.data.keyboard.Flags = RI_KEY_MAKE;      //Key down
    raw.data.keyboard.MakeCode = static_cast<WORD>(MapVirtualKeyEx(c, MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));
    raw.data.keyboard.Message = WM_KEYDOWN;
    raw.data.keyboard.VKey = VkKeyScanEx(c, GetKeyboardLayout(0));
    raw.data.keyboard.ExtraInformation = 0;         //???

    //Send the message
    SendMessage(hPSWnd, WM_INPUT, 0, (LPARAM)raw/*Raw input handle*/);      //TODO: Handle to raw input

私が立ち往生している場所は少なくとも2つの位置です:

  1. 何か特別なものを渡す必要がありますraw.data.keyboard.ExtraInformationGetMessageExtraInfo()、それとも、ここに何かを渡す必要はありませんか?

  2. WM_INPUTメッセージのLPARAMパラメータには、アドレスや構造自体ではなく、RAWINPUT構造へのハンドルが含まれています...このようなハンドルを作成するにはどうすればよいですか?

ウィンドウがアクティブウィンドウである必要があるため、SendInputを使用したくありません。私はすでにこれを行っており、正常に機能しましたが、別のウィンドウをアクティブにすると(もちろん)、前のウィンドウでは機能しなくなりました。

つまり、私が達成しようとしているのは、アクティブなアプリケーションである必要のないアプリケーションに入力を送信することです。

4

1 に答える 1

6

すべての生の入力ドキュメントは、システムによってアプリケーションに送信された生のメッセージを処理する方法を対象としています。アプリケーションがそのようなメッセージを別のアプリケーションに送信した場合に正しく機能するという兆候はほとんどありません。受信アプリケーションはメッセージを受信するために登録するWM_INPUT必要がありますが、ほとんどのアプリケーションは登録しません。

代わりに、 MicrosoftUIオートメーションを使用することをお勧めします。

しかし、実験したい場合はWM_INPUT...

WM_INPUTメッセージのLPARAMパラメータには、アドレスや構造自体ではなく、RAWINPUT構造へのハンドルが含まれています...このようなハンドルを作成するにはどうすればよいですか?

これは非常に古いAPIであり、ハンドルベースのメモリマネージャーの1つからのハンドルを使用することを想定しています。

HGLOBAL hRaw = ::GlobalAlloc(GHND, sizeof(RAWINPUT));
RAWINPUT *pRaw = reinterpret_cast<RAWINPUT*>(::GlobalLock(hRaw));
// initialize the structure using pRaw
::GlobalUnlock(hRaw);
// use hRaw as the LPARAM
于 2012-09-25T20:26:26.130 に答える