'******************** 標準モジュール Option Explicit '(ShowWindow) Public Const SW_HIDE = 0 '指定のウインドウを非表示にし、他のウインドウをアクティブ゙化する Public Const SW_MINIMIZE = 6 '指定のウインドウをアイコン化し、タスクリスト内のトップレベルウインドウをアクティブ化する Public Const SW_RESTORE = 9 'ウインドウをアクティブ化し、表示する。ウインドウがアイコン化または最大化されているときは、元の位置とサイズに復元する Public Const SW_SHOW = 5 'ウインドウをアクティブ化し、現在の位置とサイズで表示する Public Const SW_SHOWMAXIMIZED = 3 'ウインドウをアクティブ化し、最大表示する Public Const SW_SHOWMINIMIZED = 2 'ウインドウをアクティブ化し、アイコン化する Public Const SW_SHOWMINNOACTIVE = 7 'ウインドウをアイコン化する。現在アクティブなウインドウは、アクティブなままにする。 Public Const SW_SHOWNA = 8 'ウインドウを表示する。現在アクティブなウインドウは、アクティブなままにする。 Public Const SW_SHOWNOACTIVATE = 4 '以前に表示された位置とサイズで表示する。現在アクティブなウインドウは、アクティブなままにする。 Public Const SW_SHOWNORMAL = 1 'SW_RESTORE と同じ ' ウィンドウメッセージを示す定数の宣言 Public Const WM_ACTIVATEAPP = &H1C Public Const WM_CHANGECBCHAIN = &H30D Public Const WM_CLOSE = &H10 Public Const WM_CONTEXTMENU = &H7B Public Const WM_COPYDATA = &H4A Public Const WM_DEVICECHANGE = &H219 Public Const WM_DRAWCLIPBOARD = &H308 Public Const WM_GETFONT = &H31 Public Const WM_GETICON = &H7F Public Const WM_GETMINMAXINFO = &H24 Public Const WM_GETTEXT = &HD Public Const WM_HOTKEY = &H312 Public Const WM_LBUTTONDOWN = &H201 Public Const WM_LBUTTONUP = &H202 Public Const WM_MENUSELECT = &H11F Public Const WM_MOUSEMOVE = &H200 Public Const WM_NOTIFY = &H4E Public Const WM_PRINTCLIENT = &H318 Public Const WM_RBUTTONUP = &H205 Public Const WM_SETHOTKEY = &H32 Public Const WM_SETREDRAW = &HB Public Const WM_SETTEXT = &HC Public Const WM_WININICHANGE = &H1A Public Const WM_SETTINGCHANGE = WM_WININICHANGE Public Const WM_SIZING = &H214 Public Const WM_SYSCOMMAND = &H112 Public Const WM_VSCROLL = &H115 Public Const WMSZ_BOTTOM = 6 Public Const WMSZ_BOTTOMLEFT = 7 Public Const WMSZ_BOTTOMRIGHT = 8 Public Const WMSZ_LEFT = 1 Public Const WMSZ_RIGHT = 2 Public Const WMSZ_TOP = 3 Public Const WMSZ_TOPLEFT = 4 Public Const WMSZ_TOPRIGHT = 5 Public Const WM_SETFOCUS = &H7 Public Const WM_KILLFOCUS = &H8 Public Const WM_ENABLE = &HA 'Public Const WM_SETREDRAW = &HB 'Public Const WM_SETTEXT = &HC 'Public Const WM_GETTEXT = &HD Public Const WM_GETTEXTLENGTH = &HE Public Const WM_PAINT = &HF 'Public Const WM_CLOSE = &H10 Public Const WM_QUERYENDSESSION = &H11 Public Const WM_QUIT = &H12 Public Const WM_QUERYOPEN = &H13 Public Const WM_ERASEBKGND = &H14 Public Const WM_SYSCOLORCHANGE = &H15 Public Const WM_ENDSESSION = &H16 Public Const WM_SHOWWINDOW = &H18 'Public Const WM_WININICHANGE = &H1A Public Const WM_DEVMODECHANGE = &H1B 'Public Const WM_ACTIVATEAPP = &H1C Public Const WM_FONTCHANGE = &H1D Public Const WM_TIMECHANGE = &H1E Public Const WM_CANCELMODE = &H1F Public Const WM_SETCURSOR = &H20 Public Const WM_MOUSEACTIVATE = &H21 Public Const WM_CHILDACTIVATE = &H22 Public Const WM_QUEUESYNC = &H23 'クラス名またはウィンドウキャプションからウィンドウハンドルを取得 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long '親ウィンドウをデスクトップに変更 Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 'ウィンドウへの入力有効(1)/無効(0)を設定 Declare Function EnableWindow Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Long) As Long 'カーソル位置にあるウィンドウのハンドルを取得 Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long 'ウィンドウのタイトルを取得 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 'カーソル位置のスクリーン座標を取得 ' 座標を定義する構造体の宣言 Type POINTAPI X As Long '点のx座標 Y As Long '同、y座標 End Type Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 'ウィンドウの位置と表示状態を取得 Type RECT Left As Long '矩形の左上隅のx座標 Top As Long '同、y座標 Right As Long '矩形の右下隅のx座標 Bottom As Long '同、y座標 End Type Type WINDOWPLACEMENT length As Long '構造体のサイズ(バイト数) Flags As Long 'アイコン化されたウインドウの位置および復帰方法をを指定する次の定数の組み合せ showCmd As Long '表示状態を指定する次の定数 ptMinPosition As POINTAPI 'アイコン化時の表示位置 ptMaxPosition As POINTAPI '最大化時の表示位置 rcNormalPosition As RECT '通常時の表示位置 End Type Declare Function GetWindowPlacement Lib "user32" (ByVal hWnd As Long, lpwndpl As WINDOWPLACEMENT) As Long 'ウィンドウに閉じるメッセージをポストする Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' システムコマンドに関するメッセージ定数の宣言 Public Const SC_CLOSE = &HF060& Public Const SC_MAXIMIZE = &HF030& Public Const SC_MINIMIZE = &HF020& Public Const SC_RESTORE = &HF120& Public Const SC_SCREENSAVE = &HF140& ' ウィンドウにメッセージを送る関数の宣言 Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Any) As Long '******************** フォームモジュール  fmウィンドウの位置と表示状態 Option Explicit Dim fm As Form Private Sub Form_Open(Cancel As Integer) 'Application.Echo False DoCmd.OpenForm "fmフォームを常に最背面にする_最前面になるフォーム" Set fm = Forms!fmフォームを常に最背面にする_最前面になるフォーム With fm .Caption = "テスト フォーム" !ラベル0.Caption = "このフォームのウィンドウの位置と表示状態を取得します" End With Application.Echo True End Sub Private Sub Form_Timer() Dim WinPlacement As WINDOWPLACEMENT Dim rc As Long On Error Resume Next 'ウィンドウの配置方法に関する情報を定義する WinPlacement.length = Len(WinPlacement) '構造体のサイズを設定 'ウィンドウの位置と表示状態を取得 rc = GetWindowPlacement(fm.hWnd, WinPlacement) With WinPlacement Select Case .showCmd Case SW_SHOWNORMAL With .rcNormalPosition Me!表示位置.Caption = "(" & .Left & "," & .Top & ")-(" & .Right & "," & .Bottom & ")" End With Me!表示状態.Caption = "通常" Case SW_SHOWMINIMIZED With .ptMinPosition Me!表示位置.Caption = "(" & .X & "," & .Y & ")" End With Me!表示状態.Caption = "最小化" Case SW_SHOWMAXIMIZED With .ptMaxPosition Me!表示位置.Caption = "(" & .X & "," & .Y & ")" End With Me!表示状態.Caption = "最大化" End Select End With End Sub '******************** フォームモジュール  fmウィンドウへの入力有効/無効にする Option Explicit Private Sub cmdメモ帳状態変更_Click() Dim WinHnd As Long Dim WinState As Long Dim rc As Long ' クラス名でウィンドウハンドルを取得 WinHnd = FindWindow("Notepad", vbNullString) Select Case Me!コンボ5 Case "最大化" WinState = SC_MAXIMIZE Case "最小化" WinState = SC_MINIMIZE Case "元に戻す" WinState = SC_RESTORE End Select If WinHnd <> 0 Then 'ウィンドウの状態を変更するメッセージを送信 rc = SendMessage(WinHnd, WM_SYSCOMMAND, WinState, 0) End If End Sub Private Sub cmdメモ帳閉じる_Click() Dim WinHnd As Long Dim rc As Long 'クラス名でウィンドウハンドルを取得 WinHnd = FindWindow("Notepad", vbNullString) If WinHnd <> 0 Then ' ウィンドウに閉じるメッセージをPost rc = PostMessage(WinHnd, WM_CLOSE, 0, 0) Me!cmdメモ帳起動.Enabled = True Me!cmdメモ帳起動.SetFocus Me!cmd入力不可.Enabled = False Me!cmd入力可能.Enabled = False Me!cmdメモ帳状態変更.Enabled = False Me!cmdメモ帳閉じる.Enabled = False End If End Sub Private Sub Form_Open(Cancel As Integer) Dim WinHnd As Long Dim rc As Long WinHnd = FindWindow(vbNullString, "Microsoft Access") If WinHnd <> 0 Then rc = SendMessage(WinHnd, WM_SYSCOMMAND, SC_RESTORE, 0) End If End Sub Private Sub Form_Unload(Cancel As Integer) Dim WinHnd As Long Dim rc As Long cmd入力可能_Click 'クラス名からウィンドウハンドルを取得 WinHnd = FindWindow("Notepad", vbNullString) If WinHnd <> 0 Then 'ウィンドウに閉じるメッセージをPost rc = PostMessage(WinHnd, WM_CLOSE, 0, 0) End If End Sub Private Sub cmdメモ帳起動_Click() Dim pWinHnd As Long Dim WinHnd As Long Dim rc As Long Shell "notepad.exe", vbNormalFocus Me!cmd入力不可.Enabled = True Me!cmd入力可能.Enabled = True Me!cmdメモ帳状態変更.Enabled = True Me!cmdメモ帳閉じる.Enabled = True Me!cmd入力不可.SetFocus Me!cmdメモ帳起動.Enabled = False Exit Sub pWinHnd = FindWindow("Progman", vbNullString) WinHnd = FindWindow("Notepad", vbNullString) If WinHnd <> 0 Then rc = SetParent(WinHnd, pWinHnd) End If End Sub Private Sub cmd入力可能_Click() LsEnableWindow 1 End Sub Private Sub cmd入力不可_Click() LsEnableWindow 0 End Sub Sub LsEnableWindow(fEnable As Long) Dim WinHnd As Long Dim rc As Long 'クラス名からウィンドウハンドルを取得 WinHnd = FindWindow("Notepad", vbNullString) If WinHnd <> 0 Then 'ウィンドウへの入力有効(1)/無効(0)を設定 rc = EnableWindow(WinHnd, fEnable) End If End Sub '******************** フォームモジュール  fmカーソル位置にあるウィンドウのウィンドウキャプションを表示 Option Explicit Private Sub Form_Open(Cancel As Integer) DoCmd.OpenForm "fmウィンドウへの入力有効/無効にする" DoCmd.OpenForm "fmフォームを常に最背面にする" DoCmd.OpenForm "fmフォームを常に最背面にする_最前面になるフォーム" End Sub Private Sub Form_Timer() Dim wPointApi As POINTAPI Dim WinHnd As Long Dim WinCap As String * 1024 Dim rc As Long 'カーソル位置のスクリーン座標を取得 rc = GetCursorPos(wPointApi) 'カーソル位置にあるウィンドウのハンドルを取得 With wPointApi WinHnd = WindowFromPoint(.X, .Y) End With 'ウィンドウハンドルを取得できたときは If WinHnd <> 0 Then 'ウィンドウのタイトルを取得 rc = GetWindowText(WinHnd, WinCap, Len(WinCap)) 'ウィンドウキャプションを表示 Me!cap.Caption = Left(WinCap, InStr(WinCap, vbNullChar) - 1) End If End Sub '******************** フォームモジュール  fmフォームを常に最背面にする Option Explicit Private Sub cmdフォームを常に最背面にする_Click() Dim fWinHnd As Long Dim WinHnd As Long Dim rc As Long DoCmd.OpenForm "fmフォームを常に最背面にする_最前面になるフォーム" fWinHnd = Forms!fmフォームを常に最背面にする_最前面になるフォーム.hWnd ' WinHnd = FindWindow("Progman", vbNullString) rc = SetParent(Me.hWnd, fWinHnd) End Sub