0

我正在尝试处理键盘事件的 Windows 消息并将它们传递给 awesomium webview。webview 对 windows 事件有本地处理,但主机程序必须捕获它们,然后发送它们。

我正在使用 .net 和 com 互操作来捕获和发送消息。据我所知,关键事件已传递,但输入是可变的。例如,在单次按下的文本框中输入了不同数量的字符。

这是我正在使用的代码示例(归功于 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_KEYBOARD 而不是 WH_GETMESSAGE 时,会引发 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);
}          

此代码检查是否有按键按下,如果找到,则将接受设置为 true。仅当自最后一个按键后已收到按键时,才处理 char 消息。这允许文本输入,同时保留其他消息。但是,我仍然有兴趣发现根本原因。

于 2012-04-18T10:32:56.507 回答