1

私はフックを使用しており、vkCode と scanCode があるため、コマンド ToAscii() を次のように使用しています。

...
LPWORD wCharacter;
ToAscii(kbdStruct.vkCode, kbdStruct.scanCode, keyboard_state, wCharacter, 0);

では、wCharacter はアスキー文字を正しく保持する必要がありますか?

どうすればそれを印刷できますか?

試してみprintf(wCharacter);ましたが、「「WORD *」を「const char *」に変換できません」と表示されます

私は何を間違っていますか?WORD* を印刷するにはどうすればよいですか? または、ToAscii コマンドが間違っていたのでしょうか。

4

3 に答える 3

1

これで先に進むことはできません。初期化されていないポインターを ToAscii() に渡しています。適切なコードは次のようになります。

WORD wCharacter[2];
int len = ToAscii(kbdStruct.vkCode, kbdStruct.scanCode, keyboard_state, wCharacter, 0);
if (len == 1) printf("%c", wCharacter[0]);
if (len == 2) printf("%c", wCharacter[1]);

これはコンパイルして動作するはずです。実際には、これを信頼できるものにすることはできません。渡す *keyboard_state* 変数は、フォアグラウンド ウィンドウを所有するプロセスのキーボード状態でなければなりません。また、そのプロセスで有効なキーボード レイアウトにも注意を払う必要があります (ToAsciiEx を参照)。これは、低レベルのキーボード フックでは機能しません。キーボードロガーは、代わりに WH_CALLWNDPROC フックを使用して WM_CHAR メッセージを傍受する必要があります (私は、1 つも書いていないと思います)。 他のプロセスに挿入できる DLL が必要なため、これを正しく行うのははるかに困難です。もちろん、あなたはホイールを発明しているので、構築するのではなく購入するのが最善のアドバイスです。また、ユーザーがあなたの意図について少し安心できるようになります。

于 2012-09-30T21:24:55.207 に答える
1

WORD も ToAscii() も標準の C++ であるため、これに答えるのはちょっと難しいです。ただし、とにかく次の 2 つの問題があります。

  • printf() の最初の引数はフォーマット文字列でなければなりません。あなたは何も提供しませんでした。
  • 文字列は、0 バイトで終了する一連の文字です。パラメーターとして渡された単一の文字を出力したい場合、WORD が int っぽいものであると仮定すると、"%c" フォーマット文字列を使用できます。
于 2012-09-30T21:01:40.387 に答える