OcxHookAndWindowsMessage
### OCXHookAndWindowsMessage:解析OCX的消息循环机制 #### 概述 在开发基于MFC(Microsoft Foundation Classes)的OCX控件时,可能会遇到一个常见的问题:非模态对话框无法正常接收标准的Windows消息。这主要是因为OCX控件窗口没有独立的消息循环机制,而是与宿主应用程序(如Web浏览器)共享同一消息队列。因此,非模态对话框窗口类的`PreTranslateMessage`等方法可能无法正常工作。为了解决这个问题,可以通过安装系统钩子的方式来捕获并转发消息。 #### 创建和绘制对话框 在OCX控件中创建并显示对话框是常见需求之一。例如,在`OCXCTRL1`控件中创建名为`MyDialog1`的对话框,可以在`OnCreate`成员函数中进行初始化: ```cpp int OCXCTRL1::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; m_dlg.Create(IDD_SEAL_APPEND, this); // 其他初始化代码... return 0; } ``` 其中`IDD_SEAL_APPEND`是对话框资源ID。当需要在控件中绘制对话框时,可以使用`OnDraw`成员函数来完成布局调整和显示操作: ```cpp void OCXCTRL1::OnDraw( CDC* pDC, const CRect& rcBounds, const CRect& rcInvalid) { // 绘制背景... m_dlg.MoveWindow(rcBounds, TRUE); m_dlg.ShowWindow(SW_SHOW); } ``` #### 安装钩子捕获消息 为了使非模态对话框能够接收到特定的消息(如键盘输入),需要在OCX控件中安装一个钩子。这里使用的是一种系统级钩子——`WH_GETMESSAGE`钩子,它允许程序捕获窗口消息处理前的信息。 ##### 定义全局变量和钩子处理函数 需要定义全局变量来存储钩子句柄和指向对话框对象的指针: ```cpp HHOOK hHook = NULL; MyDialog1* pDlg = NULL; ``` 然后,定义钩子处理函数`GetMsgProc`,该函数用于处理捕获到的消息: ```cpp LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); MSG* pMsg = (MSG*)lParam; if (pMsg->message == WM_KEYDOWN) { // 记录日志信息 translogtrace("Msg: %d, wPar: %d, lPar: %d", pMsg->message, pMsg->wParam, pMsg->lParam); // 处理特定的按键消息 switch (pMsg->wParam) { case 49: // 数字键 1 case 51: // 数字键 3 case 53: // 数字键 5 pDlg->PostMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam); break; default: break; } } // 调用下一个钩子处理程序 return CallNextHookEx(hHook, code, wParam, lParam); } ``` ##### 在控件中安装钩子 接下来,在`OnCreate`函数中安装钩子: ```cpp int OCXCTRL1::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; m_dlg.Create(IDD_SEAL_APPEND, this); pDlg = &m_dlg; hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, AfxGetInstanceHandle(), GetCurrentThreadId()); if (NULL == hHook) { // 钩子安装失败处理 } return 0; } ``` 通过这种方式,可以确保非模态对话框能够响应特定的Windows消息,从而实现更复杂的功能交互。这种方法对于那些需要在OCX控件中集成用户交互逻辑的开发者来说非常有用。
- prg_jzx2020-03-06有参考价值
- guoweiyi20032013-08-23就是要找这个,一般的程序可以在PreTranslateMessage中处理气泡提示,但在ocx控件中根本不执行PreTranslateMessage,搞得我头疼了很久
- 粉丝: 5
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- exp4_2.c.sln
- [雷军]美妙的爱情......福的味道。.mp3
- 2023-04-06-项目笔记 - 第三百二十阶段 - 4.4.2.318全局变量的作用域-318 -2025.11.17
- 2023-04-06-项目笔记 - 第三百二十阶段 - 4.4.2.318全局变量的作用域-318 -2025.11.17
- java资源异步IO框架 Cindy
- java资源业务流程管理(BPM)和工作流系统 Activiti
- java资源高性能内存消息和事件驱动库 Chronicle
- 哋它亢技术应用2慕课自动化学习
- java资源高性能的JSON处理 Jackson
- java资源高性能的Java 3D引擎 Xith3D