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