我们有一个VB6应用程序,我们通过MFC DLL提供了扩展功能。但是,DLL中基于CDialog的类存在特定问题。我们从VB6应用程序的主窗体传递Me.hWnd
以提供给CDialog构造函数,以便DoModal()
知道它的父级是什么。虽然基于CDialog的类仍然位于DoModal()
上的VB6应用程序之上,但它们不会像模式对话框那样阻止 VB6应用程序。也就是说,当DLL对话框保留在EXE窗口的前面时,我仍然可以单击调用DLL的按钮,再次显示对话框(再次)。
VB6代码没什么可说的。正如我所提到的,它只是传入Me.hWnd
。 MFC代码很简单:
HWND exeHwnd = pSessionContext->GetHWnd(); // our state container for the DLL
CWnd* exeWnd = CWnd::FromHandle(exeHwnd);
MyCDialog dlg(exeWnd);
INT_PTR result = dlg.DoModal();
// waits, stays in front, but does not "block" the window
switch (result) // ...
我沿途查看了值并使用Spy ++确认了窗口句柄。一切似乎都很好。我缺少什么或做错了什么想法?
附加信息
该hwnd值在其他地方用于MessageBox并按预期工作。
答案 0 :(得分:1)
一个简单的解决方案可能是在调用DLL之前禁用VB6代码中的父VB6应用程序,并且当DLL代码返回时重新启用VB6应用程序。像这样的东西(航空代码)
Me.Enabled = False
MagicDLL.ShowTheDialog(Me.hWnd)
Me.Enabled = True