【发布时间】:2020-07-07 12:48:37
【问题描述】:
我支持的这个 VB6 旧系统中的一个窗口将 Word 2007 实例作为child window 托管。在 Windows 7 上,可以毫无问题地调整父窗口的大小:窗口不会更新 until the mouse is released after resizing。但是,在 Windows 10 上,窗口会在调整大小时动态更新。
我在 Windows 10 中遇到的问题是子 Word 窗口被激活/专注于第一次更新:在子窗口获取之前,您一次只能拖动几个像素来调整父窗口的大小聚焦并取消父窗口上的resize事件(光标仍在resize图标上,但继续拖动没有效果)。最大化、最小化和恢复父窗口都正常工作。一旦子 Word 窗口关闭(通过 Word 中的文件菜单),父窗口可以正常调整大小,因为没有子窗口可以激活/聚焦。在 Windows 7 中发生了相同的自动子窗口激活后父窗口调整大小,但由于调整大小事件直到父窗口实际更新后才会触发,所以这不是问题。
我的难题是,我在代码中看不到任何提示子窗口自动激活/聚焦的原因,除非这只是默认的 Windows 行为。无论哪种情况,我都非常确定我需要一种方法来避免这种情况发生。
此代码显式所做的一切(主要是 ResizeControls() 子程序;其余的主要用于上下文)正在调整 Word 窗口的大小/位置以对应于容器的新大小父窗口,与 Windows 7 中的行为一致。
据我所知,我不相信 GetWindow() 实际上激活它获得句柄的窗口,但如果确实如此,那很可能问题的原因,在这种情况下,我需要能够在不激活窗口的情况下获得窗口句柄。
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
【问题讨论】:
-
对于
SetWindowPos,还有一个Const SWP_NOACTIVATE As Long = &H10标志。如果没有设置pWndChild将被激活。
标签: windows-7 vb6 windows-10