指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ( 親を持たないウィンドウ)のハンドルを取得(FindWindow)

user32.dll の FindWindow を用いて、指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ( 親を持たないウィンドウ)のハンドルを取得します。
※サンプルを動作した環境の Microsoft Office のバージョンは 2003 です。
サンプルのダウンロード

このカテゴリーの先頭へ このページの先頭へ

■サンプルの説明

起動したところ
起動すると、こんな画面が表示されます。Button1 をクリックすると、メモ帳・Microsoft Excel・Microsoft Access が起動していないかどうかをイミディエイトウィンドウに出力します。

このカテゴリーの先頭へ このページの先頭へ

■コード

F0012_FindWindow.vb
Imports System.Runtime.InteropServices
''' <summary>
''' FindWindow(user32.dll)
''' </summary>
Partial Public Class F0012_FindWindow
    ''' <summary>
    ''' 指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ( 親を持たないウィンドウ)のハンドルを取得
    ''' </summary>
    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, _
                                       ByVal lpWindowName As String) _
                                       As IntPtr
    End Function

    ''' <summary>
    ''' 指定された文字列と一致するクラス名を持つトップレベルウィンドウ( 親を持たないウィンドウ)のハンドルを取得
    ''' </summary>
    <DllImport("user32.dll", EntryPoint:="FindWindow", CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowByClass(ByVal lpClassName As String, _
                                              ByVal zero As IntPtr) _
                                              As IntPtr
    End Function

    ''' <summary>
    ''' 指定された文字列と一致するウィンドウ名を持つトップレベルウィンドウ( 親を持たないウィンドウ)のハンドルを取得
    ''' </summary>
    <DllImport("user32.dll", EntryPoint:="FindWindow", CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowByCaption(ByVal zero As IntPtr, _
                                                ByVal lpWindowName As String) _
                                                As IntPtr
    End Function

    ''' <summary>
    ''' Button1 ボタンクリック時のイベント
    ''' </summary>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim notepadHandle As IntPtr = FindWindow("Notepad", "無題 - メモ帳")
        If notepadHandle = IntPtr.Zero Then
            System.Diagnostics.Debug.WriteLine("メモ帳は起動してません")
        End If

        Dim excelHandle As IntPtr = FindWindowByClass("XLMAIN", IntPtr.Zero)
        ' System.Diagnostics.Process.GetProcessesByName も参考に 
        If excelHandle = IntPtr.Zero Then
            System.Diagnostics.Debug.WriteLine("Microsoft Excel は起動してません")
        End If

        Dim accessHandle As IntPtr = FindWindowByCaption(IntPtr.Zero, "Microsoft Access")
        If accessHandle = IntPtr.Zero Then
            System.Diagnostics.Debug.WriteLine("Microsoft Access は起動してません")
        End If
    End Sub
End Class
このカテゴリーの先頭へ このページの先頭へ

■参考資料

FindWindow