我在MFC中有一个ActiveX控件来操作图像,我正在尝试添加TWAIN扫描功能。
我需要能够从TWAIN驱动程序接收一条Windows消息,告诉我的控件何时扫描图像,所以我创建了一个CDialog并将Dialog的HWND传递给驱动程序。
ALl我在网上看到的示例代码然后使用PreTranslateMessage从TWAIN捕获消息,但在我的ActiveX控件中,此方法永远不会被调用。
有谁知道如何获取该Dialog的消息?我也试过使用PeekMessage但没有成功。
非常感谢
答案 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是一个棘手的生物。
相信我,这是最好的方法。你可以使用主线程的消息队列在一个线程中完成所有操作,但是要避免它。