他のEXEのハンドルを取得
                                                            玄関へお回り下さい。
他のEXEのハンドルを取得しVBから終了する       (073)
    フォームの General Declarations セクションに記入
Option Explicit   'SampleNo=073 WindowsXP VB6.0(SP5) 2002.05.16
'クラス名又はキャプションタイトルを与えて
'ウィンドウのハンドルを取得する(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
Dim strClassName  As String 'クラス名
Dim strCaptionName As String 'キャプション名


Private Sub hwndAcquire()
'ハンドル取得及び終了処理のサブプロシージャ
  Dim hwnd As Long
  Dim ret As Long
  If Len(strClassName) Then
    'クラス名を与えてハンドルを取得
    '起動中ならハンドルが返り、起動していなければ 0 が返る
    hwnd = FindWindow(strClassName, vbNullString)
  ElseIf Len(strCaptionName) Then
    'キャプション名を与えてハンドルを取得する場合
    'strCaptionName = "Microsoft Excel - Book1"  '電卓の場合  "電卓"
    hwnd = FindWindow(vbNullString, strCaptionName)
  End If
  '指定のハンドルに終了のメッセージを送る
  ret = SendMessage(hwnd, WM_CLOSE, 0&, 0&)
End Sub


Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    'クラス名の取得  Excel="XLMAIN"  電卓=SciCalc
    strClassName = Text1.Text
    hwndAcquire
    strClassName = ""
  End If
End Sub


Private Sub Text2_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    'キャプション名の取得 (Microsoft Excel - Book1   電卓)
    strCaptionName = Text2.Text
    hwndAcquire
    strCaptionName = ""
  End If
End Sub


電卓等はキャプション名が固定されているが、Excel 等はブック名等が付加されるためその都度変わります。
変わるものは、クラス名で、変わらないものはキャプション名で取得した方が便利です。


 クラス名等の取得のサンプルプログラムはMSのここにあります。

このサンプルでは、次のウィンドウ情報を取得できます。
ウィンドウハンドル
ウィンドウテキスト
ウィンドウクラス名
ウィンドウスタイル
ウィンドウ ID 番号
親ウィンドウハンドル (適用可能な場合)
親ウィンドウテキスト (適用可能な場合)
親ウィンドウクラス名 (適用可能な場合)
モジュールファイル名





2002/05/16