正如评论中提到的那样,您需要使用Windows API;这是另外一个(使用比较简单)API,帮助我确定如果用户形式离开屏幕(S)的可视区域:基于版本GetSystemMetrics的库“USER32”
声明函数
#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
。
更多信息:http://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx
我用来确定形式是关闭屏幕的功能:
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
我认为它会使用Windows API来完成这件事是可能的,但没有VBA内置在这样做的方式。 '.WindowState = xlMaximized'总是在放置窗口的监视器上最大化Excel。因此,您需要首先决定这是“很好有”功能还是“必须拥有”,因为没有简单的方法。 –
不幸的是,这是一个“必须拥有”。但以某种方式“快速和肮脏”的解决方案将罚款。:-) – Stefan
这就是我试图说,没有“快速和肮脏”。但看看这个答案http://stackoverflow.com/a/7241038/3219613有几个代码片段通过Windows API获取监视器信息。 –