在firefox上弹出模式对话框后显示NPAPI插件挂起ui

在firefox上弹出模式对话框后显示NPAPI插件挂起ui,firefox,plugins,mfc,modal-dialog,npapi,Firefox,Plugins,Mfc,Modal Dialog,Npapi,下面是我试图做的:我的合作伙伴的NPAPI插件调用我的vc dll中的函数,我的函数显示一个模式对话框并接受用户输入。但在对话框显示后,firefox的插件挂起ui将在几秒钟后弹出,我必须手动关闭它,否则NPAPI插件将在几秒钟后崩溃 HANDLE hThread - AfxBeginThread(DialogProc);//dialog diaplays in this thread MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE

下面是我试图做的:我的合作伙伴的NPAPI插件调用我的vc dll中的函数,我的函数显示一个模式对话框并接受用户输入。但在对话框显示后,firefox的插件挂起ui将在几秒钟后弹出,我必须手动关闭它,否则NPAPI插件将在几秒钟后崩溃

HANDLE hThread - AfxBeginThread(DialogProc);//dialog diaplays in this thread
MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLINPUT);
此外,如果我将firefox设置为对话框的父窗口(我使用
getForgroundWindow()
获取firefox的句柄),我的对话框将导致UI挂起

我已经尝试过谷歌,我确实发现了一些类似的问题(),但这些问题的答案并没有解决我的问题


我们将非常感谢您的帮助。

您的问题是您正在阻塞主线程。您可能正在另一个线程上打开该对话框,但当您打开
MsgWaitForMultipleObjects
时,该对话框会一直阻塞,直到其他线程完成。您的函数必须返回,不能等待对话框。

经过几天的搜索和测试,我终于找到了两种解决此问题的方法

  • 使用win32 API
    DialogBox
    DialogBoxParam
    而不是MFC DoModal弹出模式对话框
  • 2.使用MFC DoModal,但在OnInitDialog中添加一个小技巧,弹出一个消息框并立即自动关闭。这样对话框就不会使插件挂起


    两个1)2)在主线程中弹出对话框。我真的不明白为什么?它应该与windows消息处理机制有关。任何人有任何想法,我们都可以讨论。:-)

    我必须等到线程完成,或者说我想要的只是模态对话框,我需要用户输入,然后继续运行。我找到了一些方法来完成这项工作,如果你想看一下我的答案。:-。。。说真的,你等不及对话了。根据定义,如果您正在等待对话框,那么您就是在阻塞主线程。阻止主线程意味着“在主线程上的任何时间段内等待任何事情发生”。如果你的电脑上有VS/VC6 IDE,你可以进行一个简单的测试。我不明白你的意思,但我想说你要么(a)不明白“阻止主线程”是什么意思,要么(b)这会触发一些奇怪的行为,其中主线程上有不同的执行线程,这可能非常危险。您正在等待(不是从NPAPI的函数调用返回)或者您没有等待(不是阻塞);如果你没有等待/阻止,你会没事的。如果你正在等待/阻止,那么你会有问题。这不是一件复杂的事情。如果你需要等待一个对话框,在另一个线程中等待。如果我在另一个线程中等待一个对话框,那么我必须在主线程中等待这个线程,这会导致同样的情况。重点是在用户关闭对话框之前,我无法从函数返回。我不知道为什么,
    DialogBox
    会使firefox插件中的“等待/阻止”行为安静正常。你没有在听。NPAPI规范说你不能这样做。完全禁止在主线程上等待。如果你这样做,你将得到你正在使用的对话框抱怨。句号。如果你找到了一种似乎可以避免它的方法,那么我保证某些危险的事情正在发生。这不是观点,这不是你可以说的“但我的用例需要它”。找到另一种方法。