0xE0 0x1D(右のCTRL)のような拡張スキャンコードを使用してキー押しをシミュレートしたい場合、どのようにCでそのようなキーをシミュレートしますか?私はSendInput
を2つのINPUT
構造体で呼び出そうとしましたが、左側のCTRLキーだけが "押されました"。 「双子」(ShiftとAlt)を持つ他のキーの場合も同じことが起こります。Winapi - 拡張キーボードスキャンコード
第2に、「拡張」キーのキーアップイベントはどのように発生しますか?
0xE0 0x1D(右のCTRL)のような拡張スキャンコードを使用してキー押しをシミュレートしたい場合、どのようにCでそのようなキーをシミュレートしますか?私はSendInput
を2つのINPUT
構造体で呼び出そうとしましたが、左側のCTRLキーだけが "押されました"。 「双子」(ShiftとAlt)を持つ他のキーの場合も同じことが起こります。Winapi - 拡張キーボードスキャンコード
第2に、「拡張」キーのキーアップイベントはどのように発生しますか?
KEYBDINPUT
構造はあなたのために0xE0
バイトを処理するためKEYEVENTF_EXTENDEDKEY
フラグを持っています
指定した場合は、スキャンコードは、値0xE0となって(224)を持つプレフィックスバイトが先行しました。
このような何か試してみてください:あなたは絶対にスキャンコードが必要な場合は、
INPUT inputs[2];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;
inputs[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT));
inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, inputs, sizeof(INPUT));
しかし:しかし、私は代わりにスキャンコードの仮想キーを使用することをお勧めし
INPUT inputs[2];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = 0x1D;
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY;
CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT));
inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, inputs, sizeof(INPUT));
を少なくともMapVirtualKey()
を見て、仮想キーをスキャンコードに変換してください:
キーを同じアプリケーションまたは別のアプリケーションに送信するかどうかを指定していません。 SendInputを使用すると、キーがどこに行くかを指定することはできません。どういうわけかウィンドウがアクティブで、フォーカスが適切に設定されていることを確認する必要があります。 SendInputはWM_KEYDOWNまたはWM_KEYUPメッセージを送信することに注意してください。 SendMesageを直接使用してWM_KEYDOWNおよびWM_KEYUPメッセージを送信する場合は、さらに柔軟性があります。送信するウィンドウのウィンドウハンドルを指定します。 ウィンドウハンドルは、テキストボックスまたは他のコントロールがあるウィンドウではなく、テキストを受け取るテキストボックスまたはコントロール用です。
これはSendMessageで使用する正確なパラメータを決定する方法です。 SendInputはSendMessageを生成することに注意してください。
Visual Studioの[ツール]メニューをクリックします。 「Spy ++」と「Spy ++ x64」が表示されます。私はどちらか一方が必要なときは確信が持てませんが、一方がうまくいかなければ他方を試してみてください。 Spy ++では、メッセージメニューをクリックしてから「ログオプション...」をクリックします。右上の領域で、Findorツールをクリックしてウィンドウにドラッグします。マウスを離した後、[メッセージ]タブをクリックします。 「すべてクリア」をクリックし、「キーボード」のチェックボックスをオンにします。メッセージメニューにはロギングの開始と停止のコマンドもありますが、デフォルトではオンになっていると思います。選択したウィンドウに移動し、試したいキーを入力します。 Spy ++で記録されたメッセージを見てください。ウィンドウに/から送信されたすべてのメッセージが表示されます。私は通常、ロギングのために選択されたメッセージに応じて、必要なものをすべて手に入れてすぐにロギングを停止します。キーボードメッセージのみを記録している場合は、あまりにも多くのメッセージを記録することはありません。
私の場合、拡張フィールドは右のCtrlでは1、左のCtrlでは0です。
質問は、どのパラメータを 'SendInput'に渡すかを尋ねています。 (注入された)入力から生成されたメッセージを観察することは役に立たない。 – IInspectable
P.S .:ターゲットプロセスのビット数と一致するビット数でSpy ++を選択します。 – IInspectable
@IInspectable、いいえ、質問は "SendInputに渡すパラメータ"ではありません。それは "どのように私はそのようなキーをシミュレートするだろう"と尋ねる。 Spy ++ツールは、これを行う方法を正確に示しています。 SendMessageで使用する正確なパラメータを示します。 Spy ++の使い方を知ることは、今後さらに多くのことに役立ちます。 – user34660
https://batchloaf.wordpress.com/2012/10/18/simulating-a-ctrl-v-keystroke-in-win32-c-or-c-using-sendinput/ –
このリンクのコードはハードウェアスキャンコードの代わりにバーチャルキーコードを使用してください。私はスキャンコードを探しています。 –
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646306(v=vs.85)。aspx –