2016-05-01 17 views
3

0xE0 0x1D(右のCTRL)のような拡張スキャンコードを使用してキー押しをシミュレートしたい場合、どのようにCでそのようなキーをシミュレートしますか?私はSendInputを2つのINPUT構造体で呼び出そうとしましたが、左側のCTRLキーだけが "押されました"。 「双子」(ShiftとAlt)を持つ他のキーの場合も同じことが起こります。Winapi - 拡張キーボードスキャンコード

第2に、「拡張」キーのキーアップイベントはどのように発生しますか?

+0

https://batchloaf.wordpress.com/2012/10/18/simulating-a-ctrl-v-keystroke-in-win32-c-or-c-using-sendinput/ –

+0

このリンクのコードはハードウェアスキャンコードの代わりにバーチャルキーコードを使用してください。私はスキャンコードを探しています。 –

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646306(v=vs.85)。aspx –

答えて

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()を見て、仮想キーをスキャンコードに変換してください:

-2

キーを同じアプリケーションまたは別のアプリケーションに送信するかどうかを指定していません。 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です。

+0

質問は、どのパラメータを 'SendInput'に渡すかを尋ねています。 (注入された)入力から生成されたメッセージを観察することは役に立たない。 – IInspectable

+0

P.S .:ターゲットプロセスのビット数と一致するビット数でSpy ++を選択します。 – IInspectable

+0

@IInspectable、いいえ、質問は "SendInputに渡すパラメータ"ではありません。それは "どのように私はそのようなキーをシミュレートするだろう"と尋ねる。 Spy ++ツールは、これを行う方法を正確に示しています。 SendMessageで使用する正確なパラメータを示します。 Spy ++の使い方を知ることは、今後さらに多くのことに役立ちます。 – user34660