VB6 不要在 Auto-Activate Child 上形成 Form-Resize Windows 10

VB6 Don't Auto-Activate Child Form on Form-Resize Windows 10

我支持的这个 VB6 遗留系统中的一个 window 将 Word 2007 实例托管为 child window. On Windows 7, the parent window can be resized without any issues: the window doesn't update until the mouse is released after resizing。然而,在 Windows 10 上,window 在调整大小时会动态更新。

我在 Windows 10 中遇到的问题是 child Word window 在第一次更新时变得 activated/focused:您只能拖动以调整大小parent window 一次几个像素,然后 child window 获得焦点并且 parent window 上的调整大小事件是已取消(光标仍在调整大小图标上,但继续拖动无效)。最大化、最小化和恢复 parent window 都正常工作。一旦 child Word window 关闭(通过 Word 中的文件菜单), parent window 可以正常调整大小,因为没有 child window 到 activate/focus。同样的 automatic-child-window-activation-after-parent-window-resizing 出现在 Windows 7 中,但是因为调整大小事件直到 parent window 实际更新后才会触发,所以这不是问题。

我的难题是我在代码中没有看到任何提示为什么 child window 会自动获取 activated/focused,除非那只是默认值 Windows行为。无论哪种情况,我都非常确定我需要一种方法来避免这种情况发生。

这段代码 明确地 所做的(主要是 ResizeControls() 子;其余主要用于上下文)是 resizing/positioning Word window 来对应 parent window 中容器的新大小,这与 Windows 中的行为一致 7.

据我所知,我不相信 GetWindow() 实际上激活 window 它得到的句柄,但如果确实如此,那么这可能就是问题的原因,在这种情况下,我需要能够在不激活它的情况下获得 window 的句柄。

PDFView.frm:

Begin VB.Form frmPDFView
    Caption         =   "Untitled"
    ClientHeight    =   8655
    ClientLeft      =   1320
    ClientTop       =   1665
    ClientWidth     =   9270
    ' ...

    Begin VB.PictureBox picContainer 
        BackColor       =   &H00FFFFFF&
        Height          =   4215
        Left            =   1080
        ScaleHeight     =   4155
        ScaleWidth      =   4995
        TabIndex        =   0
        Top             =   120
        Width           =   5055
    End
End

Private Sub ResizeControls()
On Error Resume Next

    Dim pWndChild As Long
    Dim r As RECT
    Dim rtn As Long

    picContainer.Left = 100
    picContainer.Height = Me.Height - 1300
    picContainer.Width = Me.Width - 350
    picContainer.Top = 300

    pWndChild = GetWindow(picContainer.hWnd, GW_CHILD)
    rtn = GetLastError

    If (pWndChild) Then
        rtn = GetClientRect(picContainer.hWnd, r)
        rtn = SetWindowPos(pWndChild, 0, 0, 0, r.Right - r.Left, r.Bottom - r.Top, SWP_NOZORDER Or SWP_NOMOVE)
    Else
        rtn = GetLastError
    End If

End Sub

Private Sub Form_Resize()
On Error GoTo ERROR_HANDLER

    Call ResizeControls

    Exit Sub

ERROR_HANDLER:
    Err.Clear
    Resume Next

End Sub

原来我是瞎子and/or没有仔细阅读文档所有代码中使用的Windows函数。第二天找到了解决方案,忘了回来回答这个问题,但正如 @wqw's , the issue was with SetWindowPos(). The SWP_NOACTIVATE flag 所确认的那样,需要将其传递给 SetWindowPos() 以防止激活目标 window (在我的例子中,子词 window).