0

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

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

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

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

非常感谢

4

1 回答 1

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 是一个狡猾的生物。

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

于 2009-04-07T13:31:35.427 回答