.NET TIPS

デスクトップ上のすべてのメイン・ウィンドウを列挙するには?

デジタルアドバンテージ
2004/11/19

 デスクトップ上のすべてのメイン・ウィンドウを列挙するには、Win32 APIではEnumWindows関数を利用するが、.NET Frameworkのクラス・ライブラリでは、同等の機能をProcessクラス(System.Diagnostics名前空間)を利用して実現できる。

 具体的には、実行中のすべてのプロセス(Processオブジェクト)を取得して、それぞれのプロセスがメイン・ウィンドウを持っているかどうかをチェックすればよい。

 メイン・ウィンドウの有無は、各プロセスに対して、メイン・ウィンドウのウィンドウ・ハンドル(MainWindowHandleプロパティ)が設定されているかどうかを調べる。もし、MainWindowHandleプロパティの値が「IntPtr.Zero」(=未設定)であれば、そのプロセスはメイン・ウィンドウを持っていないことを意味する。

if (p.MainWindowHandle != IntPtr.Zero) {
  // プロセスpはメイン・ウィンドウを持っている
}

 また、現在実行中のすべてのプロセスは、ProcessクラスのGetProcessesメソッドにより取得できる。

foreach (Process p in Process.GetProcesses()) {
  //現在実行中のプロセスを1つずつ処理
}

 以上の方法を実装した、デスクトップ上のメイン・ウィンドウの一覧を表示するサンプル・プログラムを次に示す。

// enumwin.cs

using System;
using System.Diagnostics;

public class EnumWindows {
  static void Main() {
    foreach (Process p in Process.GetProcesses()) {
      if (p.MainWindowHandle != IntPtr.Zero) {
        Console.WriteLine(p.ProcessName
            + " : " + p.MainWindowTitle);
      }
    }
    // 出力例:
    // vim : VIM - C:\c#\tips\enumwin\enumwin.cs
    // explorer : C:\bin
    // NetCaptor : NetCaptor
    // OUTLOOK : 予定表 - Microsoft Outlook
    // cmd : コマンド プロンプト - enumwin
    // iexplore : @IT:Insider.NET - Microsoft Internet Explorer
  }
}

// コンパイル方法:csc enumwin.cs
デスクトップ上のメイン・ウィンドウ一覧を表示するC#のサンプル・プログラム(enumwin.cs)
 
' enumwin.vb

Imports System
Imports System.Diagnostics

Public Class EnumWin
  Shared Sub Main()
    For Each p As Process In Process.GetProcesses()
      If Not p.MainWindowHandle.Equals(IntPtr.Zero)
        Console.WriteLine(p.ProcessName _
            & " : " & p.MainWindowTitle)
      End If
    Next
    ' 出力例:
    ' vim : VIM - C:\c#\tips\enumwin\enumwin.cs
    ' explorer : C:\bin
    ' NetCaptor : NetCaptor
    ' OUTLOOK : 予定表 - Microsoft Outlook
    ' cmd : コマンド プロンプト - enumwin
    ' iexplore : @IT:Insider.NET - Microsoft Internet Explorer
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll enumwin.vb
デスクトップ上のメイン・ウィンドウ一覧を表示するVB.NETのサンプル・プログラム(enumwin.vb)

 なお、一覧表示に使用しているProcessクラスのProcessNameプロパティはプロセスの名前を、MainWindowTitleプロパティはメイン・ウィンドウのタイトル文字列を取得するためのものである。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ウィンドウ
使用ライブラリ:Processクラス(System.Diagnostics名前空間)
 
この記事と関連性の高い別の.NET TIPS
プロセス情報を名前を基に取得するには?
多重起動禁止時に実行中のWindowsアプリケーションを最前面に表示するには?
外部プログラム実行時に処理が固まる場合には?
コンソール・アプリケーションの出力を取り込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間