ToAscii()
グローバルな WH_KEYBOARD_LL フックでorを呼び出すToUnicode()
と、デッドキーが押されると「破棄」されるようです。
たとえば、Windows で入力言語をスペイン語に設定していて、プログラムでアクセント付き文字áを入力したいとします。通常、一重引用符キー (デッド キー) を押してから文字 "a" を押すと、期待どおり、アクセント付きのáが画面に表示されます。
ToAscii()
ただし、またはToUnicode()
を低レベルのキーボード フック関数で呼び出した場合、これは機能しません。デッドキーが破壊されたようで、アクセント付きの文字áが画面に表示されません。上記の関数の呼び出しを削除すると問題は解決します...しかし、残念ながら、これらの関数を呼び出せるようにする必要があります。
私はしばらくグーグルで調べましたが、多くの人がこの問題を抱えているように見えましたが、良い解決策は提供されませんでした.
どんな助けでも大歓迎です!
編集: LowLevelKeyboardProcToAscii()
フック関数で受け取った仮想キー コードとスキャン コードを、ユーザーの画面に表示される結果の文字に変換するために呼び出しています。
を試しMapVirtualKey(kbHookData->vkCode, 2)
ましたが、これは のように「完全な」機能ではありませんToAscii()
。たとえば、Shift + 2 を押すと、'@' ではなく '2' が返されます (または、ユーザーのキーボード レイアウト/言語に対して Shift + 2 が生成するもの)。
ToAscii()
完璧です...デッドキーが押されるまで。
EDIT2:関係のない情報が削除されたフック関数は次のとおりです。
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}