0

良い一日。タイプされたテキストを監視する必要がありました。つまり、キーストロークはありませんが、派生文字です。

最初は、押されたキーの仮想キーコードを取得するために生の入力方法を使用しましたが、仮想キーコードを文字に適切に変換できなかったため、この決定を放棄する必要がありました。

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 は入力された文字と一致しません。ラテン語の場合 - 大丈夫です。

テキストが入力されるプロセスの入力言語を考慮して仮想キーコードを文字に変換する方法 + 複合文字を採用できる (例: ô)。または、フックを使用したバージョンの問題を解決する方法を教えてください。

前もって感謝します )

4

1 に答える 1

1

ユーザーがキーを入力すると、キーボードは 2 つのスキャン コードを生成します。1 つはユーザーがキーを押したとき、もう 1 つはユーザーがキーを離したときです。

出典:キーボード入力について - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx

WM_CHAR は、アプリケーションが文字エンコーディングとして Unicode 用にコンパイルされている場合にのみ UTF-16 になります (つまり、MBCS と UNICODE の違い)。アプリケーションが MBCS (マルチバイト文字セット) で構築されている場合、システムは現在のシステム コード ページを使用して Unicode 文字を "Ansi" (引用符で囲む) に変換し、それを送信します。

そのため、アプリが構成されている文字エンコーディングのビルド設定を確認してください。

ソース: Unicode およびマルチバイト文字セット (MBCS) のサポート: http://msdn.microsoft.com/en-us/library/ey142t48(v=vs.80).aspx

于 2012-08-23T15:35:19.713 に答える