【问题标题】:CDialog not Receiving Windows Messages in ActiveX ControlCDialog 在 ActiveX 控件中不接收 Windows 消息
【发布时间】:2010-10-17 01:38:32
【问题描述】:

我在 MFC 中有一个处理图像的 ActiveX 控件,我正在尝试向它添加 TWAIN 扫描功能。

我需要能够接收来自 TWAIN 驱动程序的 Windows 消息,该消息告诉我的控件何时扫描了图像,因此我创建了一个 CDialog 并将 Dialog 的 HWND 传递给驱动程序。

我在网上看到的所有示例代码都使用 PreTranslateMessage 来捕获来自 TWAIN 的消息,但在我的 ActiveX 控件中,这个方法永远不会被调用。

有谁知道我如何获取该对话框的消息?我也尝试过使用 PeekMessage,但没有成功。

非常感谢

【问题讨论】:

  • 您是在控件中还是在对话框中定义了 PreTranslateMessage?

标签: mfc activex messages


【解决方案1】:

您不需要创建 CDialog。您只需要任何窗口来处理消息。任何与 TWAIN 打交道的事情都最好在其自己的线程中处理。因此,为 MFC 创建一个新线程(通过 CWinThread 或 AfxBeginThread)。在该线程中,创建一个 CWnd。这个 CWnd 的 HWND 是您将传递给 DSM 的所有调用等的那个。每个线程都有自己的消息队列,所以在那里设置一个。通过 PostMessage、SendMessage、PostThreadMessage 等与该线程进行通信。假设您发布消息 MY_SPECIAL_MESSAGE 以表示正在获取图像,您的消息循环应该如下所示:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    if (msg.message == MY_SPECIAL_MESSAGE)
    {   
        GetImageFromTWAIN();
    }
    else if (!ProcessTWAINMessage(&msg)) {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}

一定要查看 TWAIN 开发工具包中的源代码,以了解这一切是如何工作的。 TWAIN 是一个狡猾的生物。

相信我,这是最好的方法。您可以使用主线程的消息队列在单个线程中完成所有操作,但应避免这样做。

【讨论】:

  • Hey adzm - 多年来,我一直在努力(同步 GetMessage 循环),但实际上你的方式听起来更好 - 考虑到线程间同步和通信的麻烦。嗯——还有多线程调试……你用过这个吗,如果用过,请问它暴露在哪些环境中?
  • 是的,这种精确的方法目前在超过一千家医疗机构中进行生产,其中一些机构每天扫描数百张图像。
  • (已经使用了好几年了)
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多