API関数のEnumWindows()及びコールバックメソッド用デリゲートを使うことで、全てのウィンドウを列挙する事ができる。 また、列挙に際してIsWindowVisible() API関数を同時に用いることで可視ウィンドウだけを列挙することができる。

Sponsored Link

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()の部分を削除すればよい。