我正在尝试处理键盘事件的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随后输出的字符数相匹配。我应该仅限于第一条消息吗?虽然这可行,但我仍然想知道为什么会这样。答案 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消息。这允许文本输入,同时保留其他消息。然而,我仍然对发现根本原因感兴趣。