VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 アプリケーション(自・他)関係のメニュー
1.VB上から他の実行可能プログラム(EXE)を起動する
2.指定のウィンドウを常に手前に表示する(フォームを最前面に表示)
3.関連付けられたアプリケーションでファイルを開く
4.他のアプリのウィンドウを操作(最小化・元のサイズ・終了他)する
5.他のEXEのハンドルを取得しVBから終了する
6.Shell関数で起動したプログラムの終了を待つ
7.アクティブウィンドウのキャプションタイトルを取得する
8.アクティブウィンドウにキーストロークを渡す
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


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.上記実行結果(コントロール類の配置図)

 application01_01

 ここでは、ウィンドウのハンドルを取得するのにクラス名又はキャプションタイトルを与えて FindWindow API で取得していますが、GetForegroundWindow API を使ってアクティブウィンドウのハンドルを取得する方法をSampleNo.128で紹介しています。
クラス名の取得方法はMSDNに”[VB] ウィンドウのクラス名や属性を取得する方法”でサンプルがあります。  
文書番号: JP112649
 Windows 98、Windows 2000以降、フォアグラウンドウィンドウを設定することができるプロセスは、システムにより制限されました。
 従って、SetForegroundWindow だけでは、指定のウィンドウをZオーダーのトップ位置に移動しアクティブにする事ができない場合があります。詳しくは、MSDN の SetForegroundWindow の項の解説をご覧下さい。
その場合は、SampleNo.246 の指定のウィンドウをトップ位置に移動しアクティブにするをご使用下さい。

このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
ウィンドウをアクティブにする ウィンドウを元のサイズに戻す ウィンドウを最前面に表示する ウィンドウを最小化する ウィンドウを終了する
クラス名又はキャプション名を与えてウィンドウのハンドルを取得する ウィンドウがアイコン化されているかどうかを取得する
他のアプリケーションウィンドウを操作 


このページのトップへ移動します。