4.他のアプリのウィンドウを操作(最小化・元のサイズ・終了他)する |
1.ウィンドウを操作(最小化・元のサイズ・終了他)する 上記サンプルには、下記のような機能があります。 1.他のEXEのウィンドウをアクティブにする。 2.他のEXEのウィンドウを元のサイズに戻す。 3.他のEXEのウィンドウを最前面に表示する。 4.他のEXEのウィンドウを最小化する。 5.他のEXEのウィンドウを終了する。 6.クラス名又はキャプション名を与えてウィンドウのハンドルを取得する。 7.ウィンドウがアイコン化されているかどうかを取得する。 2.上記実行結果(コントロール類の配置図) 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定:追加なし 使用 API:FindWindow SendMessage SetForegroundWindow OpenIcon IsIconic SetWindowPos CloseWindow その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :使用コントロール類や配置は下図を参考にして下さい。
|
1.ウィンドウを操作(最小化・元のサイズ・終了他)する(SampleNo.001) 2002.04.15 (1) 2006.12.28 |
Option Explicit 'クラス名又はキャプション名を与えてウィンドウのハンドルを取得(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の現在位置を保持する 'ウィンドウのZオーダーの配置を示す定数の宣言 'Private Const HWND_TOP = 0 'ウィンドウをZオーダーの一番上に配置する 'Private Const HWND_BOTTOM = 1 'ウィンドウをウィンドウリストの一番下に配置する 'Private Const HWND_NOTOPMOST = (-2) 'ウィンドウをウィンドウリストの一番上(但し、ほか ' のウィンドウがHWND_TOPMOSTに配置されている ' 場合はそのすぐ下)に配置する 'ウィンドウのサイズと位置の変更に関する定数の宣言 'Private Const SWP_NOZORDER = &H4& 'ウィンドウリスト内での現在位置を保持する 'Private Const SWP_NOREDRAW = &H8& 'ウィンドウを自動的に再描画しない 'Private Const SWP_NOACTIVATE = &H10& 'ウィンドウをアクティブにしない 'Private Const SWP_FRAMECHANGED = &H20& 'Private Const SWP_SHOWWINDOW = &H40& 'ウィンドウを表示する 'Private Const SWP_HIDEWINDOW = &H80& 'ウィンドウを隠す 'Private Const SWP_NOCOPYBITS = &H100& 'クライアント領域の内容をクリアする 'Private Const SWP_NOOWNERZORDER = &H200& 'オーナーウィンドウのZオーダーは変えない 'Private Const SWP_DRAWFRAME = &H20& '再描画のときウィンドウを囲む枠も描画 'Private Const SWP_NOREPOSITION =&h200& 'SWP_NOOWNERZORDER と同じ ' 設定例 retValue = SetWindowPos (lnghwnd, HWND_TOPMOST _ , 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) '================================================================== '指定のウィンドウをアイコン化する(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 |
2.上記実行結果(コントロール類の配置図) |
ここでは、ウィンドウのハンドルを取得するのにクラス名又はキャプションタイトルを与えて FindWindow API で取得していますが、GetForegroundWindow API を使ってアクティブウィンドウのハンドルを取得する方法をSampleNo.128で紹介しています。 クラス名の取得方法はMSDNに”[VB] ウィンドウのクラス名や属性を取得する方法”でサンプルがあります。 文書番号: JP112649 Windows 98、Windows 2000以降、フォアグラウンドウィンドウを設定することができるプロセスは、システムにより制限されました。 従って、SetForegroundWindow だけでは、指定のウィンドウをZオーダーのトップ位置に移動しアクティブにする事ができない場合があります。詳しくは、MSDN の SetForegroundWindow の項の解説をご覧下さい。 その場合は、SampleNo.246 の指定のウィンドウをトップ位置に移動しアクティブにするをご使用下さい。 |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
ウィンドウをアクティブにする ウィンドウを元のサイズに戻す ウィンドウを最前面に表示する ウィンドウを最小化する ウィンドウを終了する クラス名又はキャプション名を与えてウィンドウのハンドルを取得する ウィンドウがアイコン化されているかどうかを取得する 他のアプリケーションウィンドウを操作 |