API関数のEnumWindows()及びコールバックメソッド用デリゲートを使うことで、全てのウィンドウを列挙する事ができる。 また、列挙に際してIsWindowVisible() API関数を同時に用いることで可視ウィンドウだけを列挙することができる。
Option Strict On Imports System Imports System.Text Imports System.Runtime.InteropServices Class EmumerateWindows ' コールバックメソッドのデリゲート Private Delegate Function EnumerateWindowsCallback(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer ' EnumWindows API関数の宣言 <DllImport("user32", EntryPoint:="EnumWindows")> _ Private Shared Function EnumWindows( _ ByVal lpEnumFunc As EnumerateWindowsCallback, _ ByVal lParam As Integer) _ As Integer End Function ' GetWindowText API関数の宣言 <DllImport("user32", EntryPoint:="GetWindowText", CharSet:=CharSet.Auto)> _ Private Shared Function GetWindowText( _ ByVal hWnd As IntPtr, _ ByVal lpString As StringBuilder, _ ByVal nMaxCount As Integer) _ As Integer End Function ' IsWindowVisible API関数の宣言 <DllImport("user32", EntryPoint:="IsWindowVisible")> _ Private Shared Function IsWindowVisible( _ ByVal hWnd As IntPtr) _ As Integer End Function ' ウィンドウを列挙するためのコールバックメソッド Public Shared Function EnumerateWindows(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer Dim sb As New StringBuilder(&H1000) ' ウィンドウが可視の場合 If IsWindowVisible(hWnd) <> 0 Then ' ウィンドウのキャプションを取得 If GetWindowText(hWnd, sb, &H1000) <> 0 Then ' 取得できたキャプションを表示 Console.WriteLine(sb.ToString()) End If End If ' 列挙を継続するには0以外を返す必要がある Return Not 0 End Function ' Mainメソッド Public Shared Sub Main() ' 列挙を開始 EnumWindows(AddressOf EnumerateWindows, 0) End Sub End Class_ Private Shared Function EnumWindows( _ ByVal lpEnumFunc As EnumerateWindowsCallback, _ ByVal lParam As Integer) _ As Integer End Function ' GetWindowText API関数の宣言_ Private Shared Function GetWindowText( _ ByVal hWnd As IntPtr, _ ByVal lpString As StringBuilder, _ ByVal nMaxCount As Integer) _ As Integer End Function ' IsWindowVisible API関数の宣言 _ Private Shared Function IsWindowVisible( _ ByVal hWnd As IntPtr) _ As Integer End Function ' ウィンドウを列挙するためのコールバックメソッド Public Shared Function EnumerateWindows(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer Dim sb As New StringBuilder(&H1000) ' ウィンドウが可視の場合 If IsWindowVisible(hWnd) <> 0 Then ' ウィンドウのキャプションを取得 If GetWindowText(hWnd, sb, &H1000) <> 0 Then ' 取得できたキャプションを表示 Console.WriteLine(sb.ToString()) End If End If ' 列挙を継続するには0以外を返す必要がある Return Not 0 End Function ' Mainメソッド Public Shared Sub Main() ' 列挙を開始 EnumWindows(AddressOf EnumerateWindows, 0) End Sub End Class]]>
using System; using System.Text; using System.Runtime.InteropServices; namespace EnumerateWindows { class EmumerateWindows { // コールバックメソッドのデリゲート private delegate int EnumerateWindowsCallback( IntPtr hWnd, int lParam ); // EnumWindows API関数の宣言 [DllImport( "user32", EntryPoint = "EnumWindows" )] private static extern int EnumWindows( EnumerateWindowsCallback lpEnumFunc, int lParam ); // GetWindowText API関数の宣言 [DllImport( "user32", EntryPoint = "GetWindowText", CharSet = CharSet.Auto )] private static extern int GetWindowText( IntPtr hWnd, StringBuilder lpString, int nMaxCount ); // IsWindowVisible API関数の宣言 [DllImport( "user32", EntryPoint = "IsWindowVisible" )] private static extern int IsWindowVisible( IntPtr hWnd ); // ウィンドウを列挙するためのコールバックメソッド public static int EnumerateWindows( IntPtr hWnd, int lParam ) { StringBuilder sb = new StringBuilder( 0x1000); // ウィンドウが可視の場合 if ( IsWindowVisible( hWnd ) != 0 ) { // ウィンドウのキャプションを取得 if ( GetWindowText( hWnd , sb , 0x1000 ) != 0 ) { // 取得できたキャプションを表示 Console.WriteLine( sb.ToString()); } } // 列挙を継続するには0以外を返す必要がある return 1; } // Mainメソッド [STAThread] public static void Main() { // 列挙を開始 EnumWindows( new EnumerateWindowsCallback( EnumerateWindows ), 0 ); } } }
Light Executer E:\Visual C# .NET Program\Samples\EnumerateWindows\bin\Debug\EnumerateWindows.exe EnumerateWindows - Microsoft Visual C# .NET [デザイン] - Class1.cs EnumerateWindows - Microsoft Visual C# .NET [デザイン] - Class1.cs Windows Media Player VBCS翻訳機 version 1.2 CodeToHTML version 1.5 Program Manager Press any key to continue
可視でないウィンドウを列挙するには、IsWindowVisible()の部分を削除すればよい。