スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#でアイコンを取得する方法 まとめ

WindowChangerを作る際に「C#で現在開いているウィンドウのアイコン取得」に関する情報が少なくて苦労したので、その資料を上げたいと思います。

手順は以下の通りです。
1.ウィンドウハンドルの取得
2.プロセスIDの取得
3.実行ファイル名の取得
4.アイコンの取得



// 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);

// GetWindowProcessId API関数の宣言
[DllImport("user32.dll")]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);


// コールバックメソッドのデリゲート
private delegate int EnumerateWindowsCallback(IntPtr hWnd, int lParam);

// 1.ウィンドウを列挙するためのコールバックメソッド
private int EnumerateWindows(IntPtr hWnd, int lParam)
{
 StringBuilder sb = new StringBuilder(0x1000);

 // ウィンドウが可視の場合
 if (IsWindowVisible(hWnd) != 0)
 {
  // ウィンドウのキャプションがある場合
  if (GetWindowText(hWnd, sb, 0x1000) != 0)
  {
   int processID;
   Icon icon;
   Process process;

   // ウィンドウハンドル→プロセスID
   GetWindowThreadProcessId(hWnd, out processID);

   // プロセスID→プロセス
   process = Process.GetProcessById(processID);

   // プロセス→実行ファイル名→アイコン
   icon = System.Drawing.Icon.ExtractAssociatedIcon(process.MainModule.FileName);
  }
 }

 // 列挙を継続するには0以外を返す必要がある
 return 1;
}

ここまで宣言しておいて、取得させたいタイミングで、

EnumWindows(new EnumerateWindowsCallback(EnumerateWindows), 0);

を実行すればOKです。

上のプログラムはアイコンを取得するだけです。
実際にはメンバ変数に保存するか、そのまま表示させて使う、という形になると思います。



上のプログラムで何をしているか簡単に説明します。

<1.ウィンドウハンドルの取得>
まず、現在開いているウィンドウ全てのウィンドウハンドルを取得します。

用いる関数:[user32.dll] int EnumWindows(EnumerateWindowsCallback lpEnumFunc, int lParam)

詳しくは説明しませんが、全てのウィンドウハンドルを参照するまで「新しいウィンドウハンドルが第1引数hWndに渡された状態」でEnumerateWindowという関数が実行されます。


<2.プロセスIDの取得>
先ほど取得したウィンドウハンドルからプロセスIDを取得します。

用いる関数:[user32.dll] int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId)

1.で取得したウィンドウハンドルを第1引数に、プロセスIDを代入させる変数の参照を第2引数に渡します。


<3.プロセスの取得>
プロセスIDよりプロセスを取得します。

用いる関数: [.NetFramework] Process Process.GetProcessById(int processId)

2.で取得したプロセスIDをそのまま引数に渡し、Prosess型の戻り値を取得します。


<4.プロセスからアイコンを取得>
次にプロセスIDから実行ファイル名を取得します。

用いる関数: [.NetFramework] Icon System.Drawing.Icon.ExtractAssociatedIcon(string filePath)

(3.で取得したプロセス).MainModule.FileNameを引数に渡し、Icon型の戻り値を取得します。


<参考にしたサイト様>
http://muumoo.jp/news/2008/03/26/0enumwindows.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/722getprocessbyname/getprocessbyname.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/432extracticon/extracticon.html
関連記事

comment

Secret

プロフィール

シロマ=ナノ

Author:シロマ=ナノ
参加予定イベント:
 ・C91 3日目西め28a

DIVA-AC:
 LV.199 白のシンフォニア

Flashカレンダー
Twitter
カテゴリ
最新記事
PCLクレジット
当ブログは、ピアプロ・キャラクター・ライセンス(http://piapro.jp/license/pcl)に基づいて、クリプトン・フューチャー・メディア株式会社のキャラクター 「初音ミク」「鏡音リン」「鏡音レン」「巡音ルカ」「Meiko」「Kaito」及びそれらに依拠して制作されたキャラクター「亞北ネル」「弱音ハク」を描いた作品を公開しています。
アクセスカウンター
検索フォーム
主な作品
WindowHelper(フリーソフト)
WindowHelperポップ

描いた絵・イラスト
リンク
バナー
当サイトはリンクフリーです。
バナーを使用したい場合は以下の画像をお使い下さい。
(リンク先に200x40サイズを置いてあります)

・通常版
banner

・ミク版
banner
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。