EnableWindow后仍然启用菜单(False)

时间:2013-07-22 12:51:33

标签: .net pinvoke

在我们的应用程序中,我们有业务要求从VB6 COM组件打开.NET表单。就VB6应用程序而言,子表单应该像ShowDialog()一样工作,但.NET应用程序应保持解锁状态。

为了处理这个问题,我使用了Show(IWin32Window)重载+ EnableWindow(hwnd,False)方法来设置.NET表单的父级并禁用所有者VB6表单。

但是,我有两个问题:

  1. 由于某种原因,菜单仍然部分启用。我无法点击菜单,但ALT快捷方式仍然有效。例如,我可以使用ALT + F打开文件菜单,然后向下箭头打开“关闭”菜单项以关闭屏幕。其他所有内容都被正确禁用(即,我无法点击任何菜单/控件或在任何地方键入任何内容)。我是否需要执行其他操作才能禁用菜单快捷方式?

  2. 我仍然可以点击VB6表格。当您使用ShowDialog()时,所有者表单会闪烁几次并将焦点重置为子表单,但EnableWindow不会发生这种情况。是否有我可以伪造ShowDialog()功能的另一个PInvoke调用?每当VB6窗口获得焦点时,有没有办法将注意力集中在.NET窗口上?

  3. 代码:

    <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)
    

0 个答案:

没有答案