.net(VB、C#)でWindowの列挙を行う
API関数のEnumWindowsを使うことで、全てのウィンドウのハンドル(HWND)を取得する事ができる。
EnumWindowsを呼び出すと、コールバックメソッドが呼び出され、存在する個々のウィンドウのHWNDが渡される。
以下の例では、EnumWindows()でウィンドウを列挙し、コールバックメソッド内ではIsWindowVisible()を使って可視ウィンドウかどうかを調べている。
また、個々の可視ウィンドウについて、GetWindowText()を使ってウィンドウのキャプションを、GetWindowThreadProcessId()とProcess.GetProcessByIdを使ってプロセス情報を取得・表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | Module Module1 Public Class Sample ''' <summary> ''' ウィンドウを列挙します。 ''' </summary> ''' <param name="lpEnumFunc">コールバック関数</param> ''' <param name="lParam">アプリケーション定義の値</param> ''' <returns></returns> ''' <remarks></remarks> <System.Runtime.InteropServices.DllImport("user32.dll")> Public Shared Function EnumWindows(ByVal lpEnumFunc As EnumWinProc, ByVal lParam As IntPtr) As Boolean End Function ''' <summary> ''' EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート ''' </summary> ''' <param name="hWnd">ウィンドウのハンドル</param> ''' <param name="lParam">アプリケーション定義の値</param> ''' <returns></returns> ''' <remarks></remarks> Public Delegate Function EnumWinProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean ''' <summary> ''' ウィンドウハンドルからキャプションを取得します。 ''' </summary> ''' <param name="hWnd">ウィンドウのハンドル</param> ''' <param name="lpString">キャプション</param> ''' <param name="nMaxCount">キャプションの最大桁数</param> ''' <returns></returns> ''' <remarks></remarks> <System.Runtime.InteropServices.DllImport("user32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> Public Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer End Function ''' <summary> ''' ウィンドウハンドルからプロセスIDを取得します。 ''' </summary> ''' <param name="hWnd">ウィンドウのハンドル</param> ''' <param name="lpdwProcessId">プロセスID</param> ''' <returns></returns> ''' <remarks></remarks> <System.Runtime.InteropServices.DllImport("user32.dll")> Public Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, <System.Runtime.InteropServices.Out()> ByRef lpdwProcessId As Integer) As Integer End Function ''' <summary> ''' ウィンドウが可視かどうかを調べます。 ''' </summary> ''' <param name="hWnd">ウィンドウのハンドル</param> ''' <returns></returns> ''' <remarks></remarks> <System.Runtime.InteropServices.DllImport("user32.dll")> Public Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As Boolean End Function End Class Sub Main() ' ウィンドウの列挙を開始 Sample.EnumWindows(AddressOf EnumerateWindow, IntPtr.Zero) Console.ReadLine() End Sub ' ウィンドウを列挙するためのコールバックメソッド Private Function EnumerateWindow(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean ' ウィンドウが可視かどうか調べる If Sample.IsWindowVisible(hWnd) Then ' キャプションとプロセスIDを表示 PrintCaptionAndProcess(hWnd) End If ' ウィンドウの列挙を継続するにはTrueを返す必要がある Return True End Function ' ウィンドウのキャプションとプロセス名を表示する Private Sub PrintCaptionAndProcess(ByVal hWnd As IntPtr) ' ウィンドウハンドルからプロセスIDを取得 Dim processId As Integer Sample.GetWindowThreadProcessId(hWnd, processId) ' プロセスIDからProcessクラスのインスタンスを取得 Dim p As Process = Process.GetProcessById(processId) ' プロセス名を表示 Console.Write("'{0}' ", p.ProcessName) ' ウィンドウのキャプションを取得・表示 Dim caption As New System.Text.StringBuilder(&H1000) Sample.GetWindowText(hWnd, caption, caption.Capacity) Console.WriteLine("({0})", caption) End Sub End Module |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; namespace CS_EnumWindowsTest { class Sample { /// <summary> /// ウィンドウを列挙します。 /// </summary> /// <param name="lpEnumFunc">コールバック関数</param> /// <param name="lParam">アプリケーション定義の値</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool EnumWindows(EnumWinProc lpEnumFunc, IntPtr lParam); /// <summary> /// EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート /// </summary> /// <param name="hWnd">ウィンドウのハンドル</param> /// <param name="lParam">アプリケーション定義の値</param> /// <returns></returns> public delegate bool EnumWinProc(IntPtr hWnd, IntPtr lParam); /// <summary> /// ウィンドウハンドルからキャプションを取得します /// </summary> /// <param name="hWnd">ウィンドウのハンドル</param> /// <param name="lpString">キャプション</param> /// <param name="nMaxCount">キャプションの最大桁数</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); /// <summary> /// ウィンドウハンドルからプロセスIDを取得します。 /// </summary> /// <param name="hWnd">ウィンドウのハンドル</param> /// <param name="lpdwProcessId">プロセスID</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); /// <summary> /// ウィンドウが可視かどうかを調べます。 /// </summary> /// <param name="hWnd">ウィンドウのハンドル</param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd); } class Program { static void Main(string[] args) { // ウィンドウの列挙を開始 Sample.EnumWindows(EnumerateWindow, IntPtr.Zero); Console.ReadLine(); } private static bool EnumerateWindow(IntPtr hWnd, IntPtr lParam) { // ウィンドウが可視かどうか調べる if (Sample.IsWindowVisible(hWnd)) { // キャプションとプロセスIDを表示 PrintCaptionAndProcess(hWnd); } // ウィンドウの列挙を継続するにはTrueを返す必要がある return true; } private static void PrintCaptionAndProcess(IntPtr hWnd) { // ウィンドウハンドルからプロセスIDを取得 int processId; Sample.GetWindowThreadProcessId(hWnd, out processId); // プロセスIDからProcessクラスのインスタンスを取得 Process p = Process.GetProcessById(processId); // プロセス名を表示 Console.Write("'{0}' ", p.ProcessName); // ウィンドウのキャプションを取得・表示 StringBuilder caption = new StringBuilder(0x1000); Sample.GetWindowText(hWnd, caption, caption.Capacity); Console.WriteLine("({0})", caption); } } } |