元ネタは、Accessウィンドウをディスクトップの中央に表示する(hatena chips)
マルチモニタ環境で使いたかったので。だけどデュアルモニタまでしか確認してない。
Option Compare Database Option Explicit 'デュアルモニタまでしか確認してない 'original:http://hatenachips.blog34.fc2.com/blog-entry-318.html Private Const MONITOR_DEFAULTTONEAREST = &H2 Private Const MONITOR_DEFAULTTONULL = &H0 Private Const MONITOR_DEFAULTTOPRIMARY = &H1 Private Const HWND_TOP = &H0 Private Const SWP_NOSIZE = &H1 Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type MONITORINFO cbSize As Long rcMonitor As RECT rcWork As RECT dwFlags As Long End Type #If VBA7 Then 'http://msdn.microsoft.com/ja-jp/library/cc428707.aspx Private Declare PtrSafe Function GetMonitorInfo Lib "user32.dll" _ Alias "GetMonitorInfoA" ( _ ByVal hMonitor As LongPtr, _ ByRef lpmi As MONITORINFO _ ) As Long 'http://msdn.microsoft.com/ja-jp/library/cc410476.aspx Private Declare PtrSafe Function MonitorFromWindow Lib "user32.dll" ( _ ByVal hwnd As LongPtr, _ ByVal dwFlags As Long _ ) As Long Private Declare PtrSafe Function GetWindowRect Lib "user32" ( _ ByVal hwnd As LongPtr, _ lpRect As RECT _ ) As Long Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _ ByVal hwnd As LongPtr, _ ByVal hWndInsertAfter As LongPtr, _ ByVal x As Long, _ ByVal y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long _ ) As Long #Else Private Declare Function GetMonitorInfo Lib "user32.dll" _ Alias "GetMonitorInfoA" ( _ ByVal hMonitor As Long, _ ByRef lpmi As MONITORINFO _ ) As Long Private Declare Function MonitorFromWindow Lib "user32.dll" ( _ ByVal hwnd As Long, _ ByVal dwFlags As Long _ ) As Long Private Declare Function GetWindowRect Lib "user32" ( _ ByVal hwnd As Long, _ lpRect As RECT _ ) As Long Private Declare Function SetWindowPos Lib "user32" ( _ ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long _ ) As Long #End If Function AppWindowCentering() Dim mi As MONITORINFO, mRect As RECT, aRect As RECT #If VBA7 Then Dim hMonitor As LongPtr, ApphWnd As LongPtr #Else Dim hMonitor As Long, ApphWnd As Long #End If ApphWnd = Application.hWndAccessApp GetWindowRect ApphWnd, aRect hMonitor = MonitorFromWindow(ApphWnd, MONITOR_DEFAULTTONEAREST) mi.cbSize = LenB(mi) GetMonitorInfo hMonitor, mi mRect = mi.rcWork SetWindowPos ApphWnd, HWND_TOP, _ (mRect.Right + mRect.Left - aRect.Right + aRect.Left) / 2, _ (mRect.Bottom + mRect.Top - aRect.Bottom + aRect.Top) / 2, _ 0, 0, SWP_NOSIZE End Function
Sub AppWindowCentering() Dim mi As MONITORINFO, mRect As RECT, aRect As RECT #If VBA7 Then Dim hMonitor As LongPtr, ApphWnd As LongPtr #Else Dim hMonitor As Long, ApphWnd As Long #End If ApphWnd = Application.hWndAccessApp GetWindowRect ApphWnd, aRect hMonitor = MonitorFromWindow(ApphWnd, MONITOR_DEFAULTTONEAREST) mi.cbSize = LenB(mi) GetMonitorInfo hMonitor, mi mRect = mi.rcWork Dim aw As Long, ah As Long, mw As Long, mh As Long aw = aRect.Right - aRect.Left: ah = aRect.Bottom - aRect.Top mw = mRect.Right - mRect.Left: mh = mRect.Bottom - mRect.Top If aw > mw Then aw = mw If ah > mh Then ah = mh Debug.Print aw; ah SetWindowPos ApphWnd, HWND_TOP, _ (mRect.Right + mRect.Left - aw) / 2, _ (mRect.Bottom + mRect.Top - ah) / 2, _ aw, ah, &H40 End Sub
考え中
アプリケーションウインドウが最大化しているときとか考えてなかった。
GetWindowPlacement/SetWindowPlacementに切り替えを考えとこ。やってみた。
0 件のコメント:
コメントを投稿