2

WinAPI関数を使用して、メモ帳などの他のアプリケーションで特定のテキストキーをキーごとに書き込む機能を作成しようとしていますSendMessage。私はこのようなコードを持っています:

//
SendMessage(handle, WM_CHAR, 0x41, 0);
SendMessage(handle, WM_CHAR, (int)Keys.A, 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'A', 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'a', 0); // 0x61
//

SendMessage(handle, WM_CHAR, (int)Keys.Space, 0);

//
SendMessage(handle, WM_KEYDOWN, (int)Keys.Shift, 0);

SendMessage(handle, WM_CHAR, 0x41, 0);
SendMessage(handle, WM_CHAR, (int)Keys.A, 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'A', 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'a', 0); // 0x61

SendMessage(handle, WM_KEYUP, (int)Keys.Shift, 0);
//

次のような出力を書き込むことになっています。

aaa1 AAA1

しかし、このコードは次のように書いています。

AAAa AAAa

なぜこれが起こるのですか?0x41キーの仮想キーコードです。押さAないShiftと小文字が作成されa、 [char a= ] は実際には出力に小文字の「a」を入力せず、このサイトのよう0x61に Numpad ( VK_NUMPAD1 0x61テンキーのキー) に 1 を入力します。1

仮想キーコード

小文字と大文字SendMessageを他のアプリケーションに送信する方法を知っている人はいますか?

4

2 に答える 2

3

それはそれが機能する方法ではありません。通常の方法は、ユーザーがキーボードのAキーを押すことです。これにより、メモ帳のWM_KEYDOWNメッセージが生成されます。メモ帳は、GetMessage()を呼び出すとこのメッセージを受信します。次に、TranslateMessage()を呼び出し、WM_CHARメッセージを生成します。生成される文字は、キーボードの状態(Shiftキーなど)とユーザーが選択したキーボードレイアウトによって異なります。キーボードの状態とレイアウトはどちらもプロセス固有です。

したがって、WM_CHARを送信して行ったことは、メモ帳自体が通常行うすべての作業を行うことでした。これは問題ありませ。WM_KEYDOWNメッセージを投稿したくありません。生成される文字を予測できないためです。メモ帳のキーボードの状態とアクティブなレイアウトを確認することはできません。

大文字のAが必要な場合は(WPARAM)'A'を送信し、小文字のaが必要な場合は(WPARAM)'a'を送信します。

于 2012-11-01T18:39:35.453 に答える
0

答えの一部は、WM_CHAR がテキストを処理し、実際には仮想キーを処理するように設計されていないことです。また、送信した文字を処理します。ただし、WM_KEYDOWN は仮想キーを処理します。

于 2012-11-01T17:54:29.607 に答える