Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中从其他运行线程中调用消息对话框 我在DLL的C++程序中调用了一个函数。 在该调用返回后,无论如何,在程序中,我通过调用DoModal创建了从CDialog继承的主对话框。 在DLL中的函数中,我运行了另一个线程,它的工作是每20秒检查一次是否存在错误。如果存在错误,它将通过::MessageBoxW…在消息对话框中显示错误 我的问题是:_C++_Multithreading_Mfc_Modal Dialog - Fatal编程技术网

在C++中从其他运行线程中调用消息对话框 我在DLL的C++程序中调用了一个函数。 在该调用返回后,无论如何,在程序中,我通过调用DoModal创建了从CDialog继承的主对话框。 在DLL中的函数中,我运行了另一个线程,它的工作是每20秒检查一次是否存在错误。如果存在错误,它将通过::MessageBoxW…在消息对话框中显示错误 我的问题是:

在C++中从其他运行线程中调用消息对话框 我在DLL的C++程序中调用了一个函数。 在该调用返回后,无论如何,在程序中,我通过调用DoModal创建了从CDialog继承的主对话框。 在DLL中的函数中,我运行了另一个线程,它的工作是每20秒检查一次是否存在错误。如果存在错误,它将通过::MessageBoxW…在消息对话框中显示错误 我的问题是:,c++,multithreading,mfc,modal-dialog,C++,Multithreading,Mfc,Modal Dialog,当我显示消息对话框时,用户可以和由主线程主对话框或其子窗口创建的窗口进行交互。我不想要它。消息对话框在所有线程上都必须是模态的,以便用户在关闭消息对话框之前不能与程序交互 解决方案选项: 在第二个线程中调用MessageBox之前,我想我可以选择以下选项: 获取程序中运行的除此线程以外的所有线程,并在其上调用sleep。但是怎么做呢? 在所有线程中打开程序中的所有窗口,并在其线程上调用EnableWindowfalse。但是怎么做呢?我发现,但是如何在程序中枚举我自己的窗口? 有什么建议吗? 限

当我显示消息对话框时,用户可以和由主线程主对话框或其子窗口创建的窗口进行交互。我不想要它。消息对话框在所有线程上都必须是模态的,以便用户在关闭消息对话框之前不能与程序交互

解决方案选项: 在第二个线程中调用MessageBox之前,我想我可以选择以下选项:

获取程序中运行的除此线程以外的所有线程,并在其上调用sleep。但是怎么做呢? 在所有线程中打开程序中的所有窗口,并在其线程上调用EnableWindowfalse。但是怎么做呢?我发现,但是如何在程序中枚举我自己的窗口? 有什么建议吗? 限制: 建议的解决方案必须满足以下限制:

我不想修改主程序.exe的源代码。我只允许更改DLL源代码。 不允许将主dilaog的句柄传递给DLL函数。由于上述限制,并且创建主对话框是在调用DLL函数之后。
它已经写在注释中:只从一个线程执行这样的UI。所以我在这里写的答案只是第二选择

如果主线程正在运行,则可以获取该线程当前活动窗口的句柄。 将其作为父对象传递给对话框并调用DoModal

但这将在线程之间创建一组消息。如果主线程正在等待且未处理任何消息,则程序可能会挂起


提示:不要从主线程传递指向CWnd的指针。获取窗口句柄并使用CWnd::FromHandle获取指向窗口对象的指针。将其传递给CDialog对象的构造函数。

UI只能在一个线程中完成。您的后台线程应该向主UI线程发送一条消息,告诉它显示相应的信息。换句话说,您必须同时更改DLL和使用它的程序。因为您不能修改exe,所以您应该在DLL中探索GUI线程。也就是说,我自己还没有真正使用GUI线程,但在这个场合需要考虑一些事情。谢谢你的回复,你说得到了当前主线程活动窗口的句柄。但是我如何在另一个线程中完成它呢?