通过SDK方式或者Atl方式添加的IE控件(WebBrowser控件)无法响应键盘的tab消息,这在输入表单的时候非常不方便,每次都需要鼠标点击输入框,我在网上看过一些文章,据说可以通过IE控件的IDocHostShowUI接口和IDocHostUIHandler2接口获取响应的消息,不过我试过这些方法,没成功~_~.于是采用了一种比较偏门的方法:挂钩键盘消息。

首先,设置键盘消息处理函数,该函数的功能是获取键盘的输入键信息,如果该键是tab键,并且是按下状态,则将该消息发送给IE控件的快捷键处理函数进行快捷键处理,同样的,为了能通过回车键提交html表单,判断输入键是回车键,并且是按键释放时,将该消息发送给IE控件的快捷键处理函数进行快捷键处理。

 

先声明一个全局的HHOOK句柄

  1. HHOOK h_Keyboard;

消息处理函数如下:

  1. LRESULT CALLBACK KeyboardProc(
  2. int code, // hook code
  3. WPARAM wParam, // virtual-key code
  4. LPARAM lParam // keystroke-message information
  5. )
  6. {
  7. if(wParam==VK_TAB && GetKeyState(wParam)< 0)
  8. {
  9. //按下tab键
  10. //::MessageBox(NULL, _T("TAB"), _T(""), 0);
  11. //以下是获取浏览器对象并像对象发送快捷键的代码,我这里的m_wndIE是AxWindow类型,如果直接用SDK创建IE控件的话,前面的代码有所不同,但后面的获取接口的方式是一致的
  12. CWebWindow* pWebWindow = g_webWindow;
  13. MSG msg;
  14. msg.hwnd = pWebWindow->m_wndIE.m_hWnd;
  15. msg.message = WM_KEYDOWN;
  16. msg.lParam = lParam;
  17. msg.wParam = wParam;
  18. HRESULT hr = S_OK;
  19. IWebBrowser2Ptr browser;
  20. hr = pWebWindow->m_wndIE.QueryControl(__uuidof(IWebBrowser2), (void**)&browser);
  21. ATLASSERT(SUCCEEDED(hr));
  22. CComPtr<IDispatch> disp;
  23. hr = browser->get_Document(&disp);
  24. ATLASSERT(SUCCEEDED(hr));
  25. //CComPtr<IHTMLDocument2> doc;
  26. CComQIPtr<IOleInPlaceActiveObject> spInPlace;
  27. hr = disp->QueryInterface(__uuidof(IOleInPlaceActiveObject), (void**)&spInPlace);
  28. ATLASSERT(SUCCEEDED(hr));
  29. if (spInPlace)
  30. bool bRet = (spInPlace->TranslateAccelerator(&msg) == S_OK) ? TRUE : FALSE;
  31. }
  32. else if (wParam == VK_RETURN && GetKeyState(wParam)> 0)
  33. {
  34. ///释放回车键
  35. //::MessageBox(NULL, _T("ENTER"), _T(""), 0);
  36. ////以下是获取浏览器对象并像对象发送快捷键的代码,我这里的m_wndIE是AxWindow类型,如果直接用SDK创建IE控件的话,前面的代码有所不同,但后面的获取接口的方式是一致的
  37. CWebWindow* pWebWindow = g_webWindow;
  38. MSG msg;
  39. msg.hwnd = pWebWindow->m_wndIE.m_hWnd;
  40. msg.message = WM_KEYUP;
  41. msg.lParam = lParam;
  42. msg.wParam = wParam;
  43. HRESULT hr = S_OK;
  44. IWebBrowser2Ptr browser;
  45. hr = pWebWindow->m_wndIE.QueryControl(__uuidof(IWebBrowser2), (void**)&browser);
  46. ATLASSERT(SUCCEEDED(hr));
  47. CComPtr<IDispatch> disp;
  48. hr = browser->get_Document(&disp);
  49. ATLASSERT(SUCCEEDED(hr));
  50. //CComPtr<IHTMLDocument2> doc;
  51. CComQIPtr<IOleInPlaceActiveObject> spInPlace;
  52. hr = disp->QueryInterface(__uuidof(IOleInPlaceActiveObject), (void**)&spInPlace);
  53. ATLASSERT(SUCCEEDED(hr));
  54. if (spInPlace)
  55. bool bRet = (spInPlace->TranslateAccelerator(&msg) == S_OK) ? TRUE : FALSE;
  56. }
  57. //返回非0值,表示我们已处理此键盘消息了
  58. return CallNextHookEx(h_Keyboard,code,wParam,lParam);
  59. }

 

然后,就是设置挂钩函数,这个放在主函数的初始化部分:

  1. h_Keyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);

最后,释放挂钩,这个放在主函数的退出之前:

  1. UnhookWindowsHookEx(h_Keyboard);

 

版权声明:本文为moodlxs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/moodlxs/archive/2012/11/01/2750142.html