-1

WM_KEYDOWN / WM_KEYUPペアを、通常はKEYBDINPUT構造体の使用に応答しないアプリケーションに送信しようとしています。エスケープキーと英数字を送信する必要があります。MSDNはハードウェア構造体の使用に関する漠然とした情報しか提供していないため、uMsgフィールドはWM_KEYDOWN / WM_KEYUPメッセージを保持するためのものであり、次の2つのフィールドはlParamのLOWORDとHIWORD用であると想定できます(いくつかのビットで構成されています)キーが「繰り返し」であるかどうかなど、スキャンコードを定義します)。

しかし、これらの値を数時間調整した後、ハードウェアのキーストロークを正しくシミュレートする方法がまったくわかりません。これを機能させるにはどうすればよいですか?

4

2 に答える 2

2

HARDWAREINPUTはまったく使用しないでください。キーボード入力をシミュレートするには、INPUT.type = INPUT_KEYBOARDを使用して、INPUT.kiメンバーを設定する必要があります。INPUT_HARDWAREオプションは、マウスまたはキーボード以外の入力デバイス用に予約されています。

アプリがこの入力に応答しない場合、次に考えられる問題は、フォーカスの問題があることです。SendInput()は、アプリのウィンドウがフォアグラウンドにあり、入力を必要とするアプリの子ウィンドウにフォーカスがある場合にのみ機能します。これを達成するのは難しい場合があります。キーを入力する別の方法は、SendMessageを含むWM_CHARメッセージを、それらを受信するウィンドウに直接送信することです。これにより、アクティブなキーボードレイアウトと修飾キー(Alt、Shift、Ctrl)の状態を処理する際のかなりの困難も回避されます。ここで発生する新しい問題は、正しいウィンドウハンドルを取得することです。

于 2013-01-27T13:22:10.013 に答える
0

KEYBDINPUTを不適切に実装し、SendInputへの1回の呼び出しで各キーストロークを送信していたことが判明しました。以下は、ターゲットアプリケーションの標準および拡張仮想キーで機能するようです。

VOID SimulateKeystroke(USHORT vk, BOOL bExtended)
{
    INPUT input = {0};

    if(bExtended) input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    input.ki.wVk  = vk;  
    input.type = INPUT_KEYBOARD;
    SendInput(1, &input, sizeof(input));

    ZeroMemory(&input, sizeof(INPUT));
    input.ki.dwFlags  =  KEYEVENTF_KEYUP;
    if( bExtended ) input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;

    input.ki.wVk = vk;
    input.type = INPUT_KEYBOARD;
    SendInput(1, &input, sizeof(input));
}
于 2013-01-27T22:38:15.337 に答える