APIを使って Window を操作する |
Window を操作(終了・アクティブ・元のサイズに戻す・最前面に表示・最小化) (001) | |
Option Explicit 'SampleNo=001 WindowsXP VB6.0(SP5) 2002.04.15 'クラス名又はキャプション名を与えてウィンドウのハンドルを取得(P81) Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long '指定のウィンドウにメッセージを送る(P750) Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long '終了のメッセージ(P835) Private Const WM_CLOSE As Long = &H10 '指定のウィンドウをZオーダーのトップ位置に移動しアクティブにする(P99) Private Declare Function SetForegroundWindow Lib "user32" _ (ByVal hWnd As Long) As Long 'アイコン化されたウィンドウのサイズと位置を直前の状態に戻す(P96) Private Declare Function OpenIcon Lib "user32" _ (ByVal hWnd As Long) As Long 'ウィンドウがアイコン化されているかどうかを調べる(P93) Private Declare Function IsIconic Lib "user32" _ (ByVal hWnd As Long) As Long '=================================== '指定のウィンドウサイズ、位置、Zオーダーを設定する(P100) 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 Private Const HWND_TOPMOST = (-1) 'WindowをWindow Listの一番上に配置する Private Const SWP_NOSIZE = &H1& 'Windowの現在のサイズを保持する Private Const SWP_NOMOVE = &H2& 'Windowの現在位置を保持する '=================================== '指定のウィンドウをアイコン化する(P73) Private Declare Function CloseWindow Lib "user32.dll" _ (ByVal hWnd As Long) As Long Dim strClassName As String 'クラス名 Dim strCaptionName As String 'キャプション名 Dim StrMsg As String 'メッセージ Dim lngOpNo As Long 'オプションの選択 Private Sub hwndAcquire() Dim lnghwnd As Long Dim retValue As Long If Len(strClassName) Then 'クラス名を与えてハンドルを取得 '起動中ならハンドルが返り、起動していなければ0が返る lnghwnd = FindWindow(strClassName, vbNullString) If lnghwnd = 0 Then StrMsg = "そのクラス名のアプリは起動していません" MsgBox StrMsg Exit Sub End If ElseIf Len(strCaptionName) Then 'キャプション名を与えてハンドルを取得する場合 lnghwnd = FindWindow(vbNullString, strCaptionName) If lnghwnd = 0 Then StrMsg = "そのキャプション名のアプリは起動していません" MsgBox StrMsg Exit Sub End If End If 'ハンドルが取得できた場合の処理 Select Case lngOpNo Case 0 '指定のハンドルに終了のメッセージを送る retValue = SendMessage(lnghwnd, WM_CLOSE, 0&, 0&) Case 1 '指定のWindowをZオーダーのトップ位置に移動しアクティブにする retValue = SetForegroundWindow(lnghwnd) Case 2 '最小化されているか調査 retValue = IsIconic(lnghwnd) If retValue Then '最小化の状態なら元のサイズに戻す retValue = OpenIcon(lnghwnd) Else StrMsg = "そのアプリは最小化になっていません。" MsgBox StrMsg End If Case 3 '最前面に表示する(以後最前面に表示される) retValue = SetWindowPos(lnghwnd, HWND_TOPMOST _ , 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) Case 4 '最小化されているか調査 retValue = IsIconic(lnghwnd) If retValue Then StrMsg = "そのアプリはすでに最小化されています。" MsgBox StrMsg Else '最小化にする retValue = CloseWindow(lnghwnd) End If End Select End Sub Private Sub Command1_Click() 'オプションボタンのチェック Dim i As Long For i = 0 To 4 If Option1(i).Value = True Then lngOpNo = i End If Next i If Len(Text1.Text) Then 'クラス名の取得 strClassName = Text1.Text hwndAcquire strClassName = "" ElseIf Len(Text2.Text) Then 'キャプション名の取得 strCaptionName = Text2.Text hwndAcquire strCaptionName = "" ElseIf Len(Text1.Text) = 0 And Len(Text2.Text) = 0 Then StrMsg = "クラス名又はキャプション名を入力して下さい。" MsgBox StrMsg End If End Sub |
|
実行結果 |
|
ここでは、ウィンドウのハンドルを取得するのにクラス名又はキャプションタイトルを与えてFindWindow APIで取得していますが、GetForegroundWindow APIを使ってアクティブウィンドウのハンドルを取得する方法をサンプルNo.128で照会しています。 クラス名の取得方法はMSDNに”[VB] ウィンドウのクラス名や属性を取得する方法”でサンプルがあります。 文書番号: JP112649 |
2002/04/15