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