CDialog未在ActiveX控件中接收Windows消息

时间:2009-04-02 08:46:13

标签: mfc activex messages

我在MFC中有一个ActiveX控件来操作图像,我正在尝试添加TWAIN扫描功能。

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

ALl我在网上看到的示例代码然后使用PreTranslateMessage从TWAIN捕获消息,但在我的ActiveX控件中,此方法永远不会被调用。

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

非常感谢

1 个答案:

答案 0 :(得分:1)

您无需创建CDialog。您只需要任何窗口来处理消息。处理TWAIN的任何事情最好在自己的线程中处理。因此,为MFC创建一个新线程(通过CWinThread或AfxBeginThread)。在该线程中,创建一个CWnd。这个CWnd的HWND是你将传递给DSM的所有调用等的HWND。每个线程都有自己的消息队列,所以在那里设置一个。通过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是一个棘手的生物。

相信我,这是最好的方法。你可以使用主线程的消息队列在一个线程中完成所有操作,但是要避免它。