1

かなり面白いです。数分前にここでキーボードのSendInput()を尋ねました-小文字のみ、大文字の文字の送信方法。解決策は、手紙の前にシフトを送ることでした。しかし、シフトをオンにした後、私はそれをオフにすることはできません...

私は次のようなKEYEVENTF_KEYUPフラグで一生懸命努力しています:

INPUT Input = { 0 };
Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

しかし、それはまったく機能しないようです。常にAAを送信します。

ありがとう。

4

1 に答える 1

1

問題は

Input.mi.dwFlags

そのはず

Input.ki.dwFlags

ロドリゴに感謝します。

もう1つの方法は、KEYEVENTF_SCANCODEフラグを使用することです。次に、VkKeyScan()を使用してcharをスキャンする必要があります-http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85 ) .aspx下位バイトと上位バイトの状態(shift、ctrlなど)。

スキャンコードを使用しているため、MAPVK_VK_TO_VSC値でMapVirtualKey()を使用して、仮想コードをスキャンコードにマッピングする必要があります。MSDNは次のように述べています。

uCodeは仮想キーコードであり、スキャンコードに変換されます。左側のキーと右側のキーを区別しない仮想キーコードの場合は、左側のスキャンコードが返されます。変換がない場合、関数は0を返します。

次に、それをInput.ki構造体のwScanフィールドに渡します。MSDNによると、スキャンコードを使用すると、wVkが無視され、wScanが使用されるためです。MSDNは次のように述べています。

指定した場合、wScanはキーを識別し、wVkは無視されます。

したがって、コードは次のようになります。

INPUT Event = { 0 };

const SHORT key = VkKeyScan('a');
const UINT mappedKey = MapVirtualKey( LOBYTE( key ), 0 );

// Press shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

// upper case 'A' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

//  release 'A'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

// Release shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

const SHORT key1 = VkKeyScan('a');
const UINT mappedKey1 = MapVirtualKey( LOBYTE( key1 ), 0 );

// lower case 'a' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

// release 'a'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

私が何か間違ったことを言った場合は、私を訂正してください。

于 2012-07-11T19:20:13.640 に答える