在我们的应用程序中,我们有业务要求从VB6 COM组件打开.NET表单。就VB6应用程序而言,子表单应该像ShowDialog()一样工作,但.NET应用程序应保持解锁状态。
为了处理这个问题,我使用了Show(IWin32Window)重载+ EnableWindow(hwnd,False)方法来设置.NET表单的父级并禁用所有者VB6表单。
但是,我有两个问题:
由于某种原因,菜单仍然部分启用。我无法点击菜单,但ALT快捷方式仍然有效。例如,我可以使用ALT + F打开文件菜单,然后向下箭头打开“关闭”菜单项以关闭屏幕。其他所有内容都被正确禁用(即,我无法点击任何菜单/控件或在任何地方键入任何内容)。我是否需要执行其他操作才能禁用菜单快捷方式?
我仍然可以点击VB6表格。当您使用ShowDialog()时,所有者表单会闪烁几次并将焦点重置为子表单,但EnableWindow不会发生这种情况。是否有我可以伪造ShowDialog()功能的另一个PInvoke调用?每当VB6窗口获得焦点时,有没有办法将注意力集中在.NET窗口上?
代码:
<DllImport("user32.dll")>
Public Shared Function EnableWindow(hwnd As IntPtr, bEnable As Boolean) As Boolean
End Function
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetForegroundWindow() As IntPtr
End Function
Public Class WindowWrapper
Implements IWin32Window
Private _handle As IntPtr
Public Sub New(handle As IntPtr)
_handle = handle
End Sub
Public ReadOnly Property Handle As System.IntPtr Implements IWin32Window.Handle
Get
Return _handle
End Get
End Property
End Class
Dim foregroundWindowId As IntPtr = GetForegroundWindow()
Dim vb6Process As Process = Process.GetProcessById(VB6ProcessId)
Dim ownerWindow As WindowWrapper = New WindowWrapper(foregroundWindowId)
EnableWindow(foregroundWindowId, False)
Show(ownerWindow)