2012-04-15 34 views
0

我正在嘗試處理鍵盤事件的窗口消息,並將它們傳遞到awesomium webview。 webview具有本地處理windows事件的功能,但主機程序必須捕獲它們併發送它們。單個物理按壓的多個字符輸入

我正在使用.net和com互操作來捕獲和發送消息。關鍵事件傳遞給我所知,但輸入是可變的。例如,在單個印刷機的文本框中輸入不同數量的字符。

這裏是我使用的(信貸Sekhat在awesomium網站)的代碼示例:

 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

我已成功地設計出一個工作的解決辦法:

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); 
}   

此代碼檢查鍵按下,如果找到,設置接受爲真。只有在自上一次以來收到關鍵字時纔會處理該字符消息。這允許文本輸入,同時保留其他消息。但我仍然對發現根本原因感興趣。