0

キーボード イベントの Windows メッセージを処理し、それらを awesomium WebView に渡そうとしています。WebView には Windows イベントのネイティブ処理がありますが、ホスト プログラムはそれらをキャプチャして送信する必要があります。

メッセージをキャプチャして送信するために、.net と com 相互運用機能を使用しています。主要なイベントは私の知る限りでは引き継がれますが、入力は可変です。たとえば、1 回のプレスでテキスト ボックスに入力される文字数はさまざまです。

これが私が使用しているコードのサンプルです(awesomiumサイトのSekhatの功績による):

        private void CreateHook()
        {

            uint threadId = Win32.GetWindowThreadProcessId(hWnd, IntPtr.Zero);

            //hHook = Win32.SetWindowsHookEx(Win32.HookType.WH_CALLWNDPROC, wndProcDelegate, IntPtr.Zero, threadId);
            hHook = Win32.SetWindowsHookEx(Win32.HookType.WH_GETMESSAGE, wndProcDelegate, IntPtr.Zero, threadId);

        }

        private int WndProcHook(int nCode, IntPtr wParam, ref Win32.Message lParam)
        {
            if (nCode >= 0)
            {
                Win32.TranslateMessage(ref lParam); 
                WndProc(ref lParam);
            }

            return Win32.CallNextHookEx(hHook, nCode, wParam, ref lParam);
        }

        wndProcDelegate = WndProcHook;

イベントの処理が間違っていて、入力の数が可変になっていませんか? 関連する部分は上にあると思いますが、必要に応じて残りを投稿できます。

ちなみに、WH_GETMESSAGE の代わりに WH_KEYBOARD を使用すると、AccessViolationException がスローされます。KEYBOARD イベントは使用するのに適していますか? ご協力ありがとうございます。

編集: さらに調査を行ったところ、タイプ 0x102 (WM_CHAR) の複数のメッセージがプログラムに渡されていることがわかりました。渡された数は、awesomium が出力している文字数と一致します。これを最初のメッセージだけに制限する必要がありますか? これはうまくいくかもしれませんが、なぜこれが起こっているのか知りたいです。

4

1 に答える 1

0

私はなんとか機能する修正を考案することができました:

if (message.msg == 256)
{
    accept = true;
}
if (accept && message.msg == 258)
{
    view.InjectKeyboardEventWin((int)message.msg, (int)message.wparam, (int)message.lparam);
    accept = false;
}
if (message.msg != 258)
{
    view.InjectKeyboardEventWin((int)message.msg, (int)message.wparam, (int)message.lparam);
}          

このコードはキーダウンをチェックし、見つかった場合は、acceptをtrueに設定します。charメッセージは、最後のキーダウン以降にキーダウンが受信された場合にのみ処理されます。これにより、他のメッセージを保持しながら、テキスト入力が可能になります。しかし、私はまだ根本的な原因を発見することに興味があります。

于 2012-04-18T10:32:56.507 に答える