单个物理印刷的多个字符输入

时间:2012-04-15 22:24:30

标签: c# com-interop awesomium

我正在尝试处理键盘事件的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随后输出的字符数相匹配。我应该仅限于第一条消息吗?虽然这可行,但我仍然想知道为什么会这样。

1 个答案:

答案 0 :(得分: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消息。这允许文本输入,同时保留其他消息。然而,我仍然对发现根本原因感兴趣。