7
void WriteChar(char c)
{
    INPUT input = {0};
    input.type = INPUT_KEYBOARD;
    input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0) ) ;   
    SendInput(1,&input, sizeof(INPUT));
}

VkKeyScanExは、「/」と「?」(同じキー)に対して異なるキーコードを返しますが、このメソッドを使用して「?」を含むメッセージを書き込もうとすると、「/」のみが書き込まれます。何が起こっているのかわかりません。';'でも同じことが起こります と ':'。

キーコードやスキャンコードがわからない部分があります。ほとんどの文字には仮想キーコードがありますが、疑問符に似たものは見つかりません。それらは存在する必要がありますが、リストされていませんか?

4

2 に答える 2

9

スキャン コードは、キーボードから返される生のキー ID です。したがって、101 キーのキーボードには (理論上) 101 個の一意のスキャン コードが返されます。(脚注1を参照)

仮想キー コードは、理想化されたキーボードのキーを表す個別のコード セットです。実際のキーボードのどこに TAB キーがあり、どのスキャンコードが使用されていても、仮想キー コードは常に VK_TAB です。 windows.h印刷できない仮想キーの VK_xxx コードを定義します。印刷可能な仮想キーの場合、仮想キー コードは ASCII 値と同じです。

ただし、仮想キー コードは引き続きキー コードです。「A」と「a」は同じ仮想キー コードを持っているため、「A」を送信する場合は、VK_SHIFT を下に送信し、次に「a」を下に送信し、次に「a」を上に送信し、次に VK_SHIFT を上に送信する必要があります。

VkKeyScanEx()文字をスキャン キーとシフト状態に変換します。このページの以下の引用を参照してください

関数が成功した場合、戻り値の下位バイトには仮想キー コードが含まれ、上位バイトにはシフト状態が含まれます。これは、次のフラグ ビットの組み合わせである可能性があります。

そのため、VkKeyScanEx() からの戻り値をそのまま取得することはできません。Shift キーにフラグが立てられているかどうかを確認する必要があります。シフトキーを別のキーストロークとして送信します

SHORT vk = VkKeyScanEx(c, ...);
if (vk & 0x100) // check upper byte for shift flag
{
   // send a shift key down
}
if (vk & 0x200) // check for ctrl flag
{
   // send a ctrl key down
}
input.ki.wVk = vk & 0xFF;

// send keyup for each of the keydown

また、キーダウンごとにキーアップを送信する必要があります。

脚注:

1これはあくまでも理論上の話であり、実際には、標準の PC キーボードは、もう入手することさえできない古い IBM キーボードをエミュレートします。同じスキャンコード。

于 2010-01-30T07:42:02.143 に答える
1

このようにしてみてください。を使用する場合KEYEVENTF_UNICODE、ホスト プラットフォームは少なくとも Windows 2000 または XP である必要があります。

INPUT input[ 2 ];

input[ 0 ].type = INPUT_KEYBOARD;
input[ 0 ].ki.wVk = 0;
input[ 0 ].ki.wScan = c;
input[ 0 ].ki.dwFlags = KEYEVENTF_UNICODE;
input[ 0 ].ki.time = 0;
input[ 0 ].ki.dwExtraInfo = GetMessageExtraInfo();

input[ 1 ].type = INPUT_KEYBOARD;
input[ 1 ].ki.wVk = 0;
input[ 1 ].ki.wScan = c;
input[ 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
input[ 1 ].ki.time = 0;
input[ 1 ].ki.dwExtraInfo = GetMessageExtraInfo();

SendInput( ( UINT )2, input, sizeof( *input ) );

入力構造を正しく入力せず、必要なメンバーを初期化せずに残したという事実から判断すると、これに関するドキュメントを見ていないと思います。SendInputINPUTKEYBDINPUTを参照してください。

于 2010-01-30T07:25:11.340 に答える