从c ++中的其他正在运行的线程模态消息对话框

时间:2014-09-20 11:53:01

标签: c++ multithreading mfc modal-dialog

我在DLL中调用了一个函数,在c ++的程序启动时。 在该调用返回之后,无论如何在程序中我通过调用DoModal()创建了从CDialog继承的主对话框。 在DLL中的函数中,我运行另一个线程,例如,它的工作是每20秒检查一次错误。如果存在错误,它将在:: MessageBoxW(...)的消息对话框中显示错误。

我的问题:

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

解决方案选项:

我认为在第二个帖子中调用MessageBox之前我有选择这个选项:

  1. 获取在我的程序中运行的此线程以外的所有线程,并在其上调用sleep。但是怎么样?
  2. 在我的程序中在所有线程中打开所有窗口并在其上调用EnableWindow(false)。但是怎么样?我找到了EnumWindows(...),但我如何在程序中枚举自己的窗口?
  3. 有什么建议吗?
  4. 限制:

    您建议的解决方案必须满足这些限制:

    1. 我不想修改主程序源(.exe)。我只允许更改DLL源。
    2. 不允许将主dilaog的句柄传递给DLL函数。由于上述限制,并且在调用DLL函数之后创建主对话框。

1 个答案:

答案 0 :(得分:0)

它已经写在评论中:只从一个线程中执行此类UI。所以我在这里写的答案只是第二选择!

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

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

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