良い一日。タイプされたテキストを監視する必要がありました。つまり、キーストロークはありませんが、派生文字です。
最初は、押されたキーの仮想キーコードを取得するために生の入力方法を使用しましたが、仮想キーコードを文字に適切に変換できなかったため、この決定を放棄する必要がありました。
MapVirtualKeyEx + LoadKeyboardLayout - 望ましい効果が得られませんでした。つまり、LoadKeyboardLayout を呼び出してロシア語のレイアウトをロードした場合でも、MapVirtualKeyEx はコード 0x41 のラテン語 A に戻ります。
そこで、フック WM_GETMESSAGE を使い始めました。
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);
// WH_GETMESSAGE
if (nCode == HC_ACTION)
{
PMSG pMsg = (PMSG)lParam;
if (pMsg != NULL)
{
if ((pMsg->message == WM_CHAR)||(pMsg->message == WM_UNICHAR))
{
keyEntry.character = pMsg->wParam;
ipc->SendData(&keyEntry, sizeof(CHARENTRY));
};
};
};
return CallNextHookEx(NULL, nCode, wParam, lParam);
デッドキーを持つキャラクターを含め、すべてが正常に機能します。
しかし、ビジュアル スタジオのエディターでテキストを入力しようとすると、問題が発生しました。
- キーを 1 回押すと、同じメッセージ WM_CHAR が 2 つ送信されます。
- キリル文字の場合、値 WM_CHAR-> wParam は入力された文字と一致しません。ラテン語の場合 - 大丈夫です。
テキストが入力されるプロセスの入力言語を考慮して仮想キーコードを文字に変換する方法 + 複合文字を採用できる (例: ô)。または、フックを使用したバージョンの問題を解決する方法を教えてください。
前もって感謝します )