如何使用Excel VBA最大化特定监视器上的窗口?
我想使用Excel VBA最大化特定屏幕上的窗口 我使用了以下代码:如何使用Excel VBA最大化特定监视器上的窗口?,excel,vba,multiscreen,Excel,Vba,Multiscreen,我想使用Excel VBA最大化特定屏幕上的窗口 我使用了以下代码: With ActiveWindow .WindowState = xlNormal .Left = 1200 .WindowState = xlMaximized End With 如果监视器2位于监视器1的右侧,则该代码有效。如果是另一种情况,则该方法失败(那么我必须使用-1200) 这个宏应该在不同的PC上工作,我不知道系统是如何配置的。是否有可能检测连接了多少个监视器,并直接寻址我
With ActiveWindow
.WindowState = xlNormal
.Left = 1200
.WindowState = xlMaximized
End With
如果监视器2位于监视器1的右侧,则该代码有效。如果是另一种情况,则该方法失败(那么我必须使用-1200)
这个宏应该在不同的PC上工作,我不知道系统是如何配置的。是否有可能检测连接了多少个监视器,并直接寻址我希望最大化窗口的相应监视器?如您需要使用Windows API的评论中所述;这是另一个(使用相对简单)API,它帮助我确定用户表单是否已从屏幕的可见区域移出:GetSystemMetricsLib“User32” 要根据Office版本声明函数,请执行以下操作:
#If Win64 Then 'Win64=true, Win32=true, Win16= false
Private Declare PtrSafe Function apiGetSystemMetrics Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
Private Declare PtrSafe Function apiGetSystemMetrics32 Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#ElseIf Win32 Then 'Win32=true, Win16=false
Private Declare Function apiGetSystemMetrics Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#Else ' Win16=true
#End If
通用功能:
Public Function dllGetMonitors() As Long
Const SM_CMONITORS = 80
dllGetMonitors = apiGetSystemMetrics(SM_CMONITORS)
End Function
'The width of the virtual screen, in pixels.
'The virtual screen is the bounding rectangle of all display monitors
Public Function dllGetHorizontalResolution() As Long
Const SM_CXVIRTUALSCREEN = 78
dllGetHorizontalResolution = apiGetSystemMetrics(SM_CXVIRTUALSCREEN)
End Function
Public Function dllGetVerticalResolution() As Long
Const SM_CYVIRTUALSCREEN = 79
dllGetVerticalResolution = apiGetSystemMetrics(SM_CYVIRTUALSCREEN)
End Function
更多信息:
用于确定窗体是否在屏幕外的函数:
Private Sub checkOffScreen(ByRef frm)
Dim maxTop As Long, minLeft As Long, maxLeft As Long
Dim defaultOffset As Byte, monitors As Byte
monitors = celTotalMonitors.Value
defaultOffset = 11
minLeft = 0 - (frm.Width - defaultOffset)
If monitors = 1 And celScreenResolutionX.Value > 1280 Then
maxTop = 1180 - defaultOffset
maxLeft = 1900 - defaultOffset
Else
maxTop = 750 - defaultOffset
maxLeft = (960 * monitors) - defaultOffset
End If
With frm
'If (celFormTop.Value < 0 Or celFormTop.Value > maxTop) Or _
(celFormLeft.Value < minLeft Or celFormLeft.Value > maxLeft) Then
'If .top < 0 Or .top > maxTop Or .Left < minLeft Or .Left > maxLeft Then
If celFormTop.Value > maxTop Or celFormLeft.Value > maxLeft Then
celFormTop = defaultOffset
celFormLeft = defaultOffset
End If
If .Top > maxTop Or .left > maxLeft Then
.Top = defaultOffset
.left = defaultOffset
End If
End With
End Sub
专用子检查屏幕外(ByRef frm)
变暗maxTop为长,minLeft为长,maxLeft为长
Dim defaultOffset作为字节,监视器作为字节
monitors=celTotalMonitors.Value
defaultOffset=11
minLeft=0-(frm.Width-defaultOffset)
如果监视器=1且celScreenResolutionX.Value>1280,则
maxTop=1180-默认偏移量
maxLeft=1900-默认偏移量
其他的
maxTop=750-默认偏移量
maxLeft=(960*监视器)-默认偏移量
如果结束
使用frm
'如果(celFormTop.Value<0或celFormTop.Value>maxTop)或_
(celFormLeft.ValuemaxLeft)然后
'如果.top<0或.top>maxTop或.LeftmaxLeft,则
如果celFormTop.Value>maxTop或celFormLeft.Value>maxLeft,则
celFormTop=defaultOffset
celFormLeft=defaultOffset
如果结束
如果.Top>maxTop或.left>maxLeft,则
.Top=默认偏移量
.left=默认偏移量
如果结束
以
端接头
我不知道Application.Right是否是一个选项,但我用-1200替换了1200,这对我很有效
Application.WindowState = xlNormal
Application.Left = -1200
Application.WindowState = xlMaximized
我认为可以使用Windows API来实现这一点,但没有内置VBA的方法来实现这一点
.WindowState=xlMaximized
始终最大化放置窗口的监视器上的Excel。所以你需要先决定这是一个“很好拥有”的功能还是一个“必须拥有”的功能,因为没有简单的方法。不幸的是,这是一个“必须拥有”的功能。但如果有一个“快而脏”的解决方案就好了。:-)这就是我想说的,没有“快而脏”的。但是看看这个答案,有几个代码片段可以通过Windows API获取监视器信息。