C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: アプリケーション名の取得


(過去ログ 37 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■18829 / inTopicNo.1)  アプリケーション名の取得
  
□投稿者/ れれれ (58回)-(2008/05/16(Fri) 16:35:23)

分類:[.NET 全般] 

お世話になっていますれれれです。

早速質問なのですが、アクティブうなウィンドウのアプリケーション(?)を取得するプログラムを考えています。

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
        
        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int length);
        private void Form1_Load(object sender, EventArgs e)
        {
            IntPtr hWnd = GetForegroundWindow();
            StringBuilder title = new StringBuilder(1048);
            GetWindowText(hWnd, title, 1024);
            MessageBox.Show(title.ToString());
        }

これでアクティブなウィンドウのタイトルは表示されますが、そのウィンドウを生成しているアプリケーション(Firefoxとか Microsoft Visual Studioなど)を取得するにはどうすればいいのでしょうか?

どうかご教授お願いします。

引用返信 編集キー/
■18835 / inTopicNo.2)  Re[1]: アプリケーション名の取得
□投稿者/ シャノン (417回)-(2008/05/16(Fri) 16:52:58)
No18829 (れれれ さん) に返信
> お世話になっていますれれれです。
>
> 早速質問なのですが、アクティブうなウィンドウのアプリケーション(?)を取得するプログラムを考えています。
>
> [DllImport("user32.dll")]
> private static extern IntPtr GetForegroundWindow();
>
> [DllImport("user32.dll")]
> private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int length);
> private void Form1_Load(object sender, EventArgs e)
> {
> IntPtr hWnd = GetForegroundWindow();
> StringBuilder title = new StringBuilder(1048);
> GetWindowText(hWnd, title, 1024);
> MessageBox.Show(title.ToString());
> }
>
> これでアクティブなウィンドウのタイトルは表示されますが、そのウィンドウを生成しているアプリケーション(Firefoxとか Microsoft Visual Studioなど)を取得するにはどうすればいいのでしょうか?
>
> どうかご教授お願いします。

GetWindowThreadProcessId 関数で、そのウィンドウを生成したプロセスの ID が取得できます。
これを Process.GetProcessById に渡せば、Process オブジェクトが得られるでしょう。

ただ、「アプリケーション名」を得るにはもう一手間要りそうです。
というか、アプリケーション名って何でしょうね?
プロセスのメインモジュールのバージョン情報から説明を引っ張ってくるとかでしょうか。
であれば、先ほど得た Process に対し、

process.Modules[ 0 ].FileVersionInfo.ProductName

で取得できるかもしれません。
引用返信 編集キー/
■18837 / inTopicNo.3)  Re[1]: アプリケーション名の取得
□投稿者/ れれれ (60回)-(2008/05/16(Fri) 16:53:32)
No18829 (れれれ さん) に返信
自己レスです。
アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。(全部のアプリケーションに対応することはできませんが・・・)
引用返信 編集キー/
■18838 / inTopicNo.4)  Re[2]: アプリケーション名の取得
□投稿者/ シャノン (419回)-(2008/05/16(Fri) 17:01:31)
No18835 (シャノン さん) に返信
> process.Modules[ 0 ].FileVersionInfo.ProductName
>
> で取得できるかもしれません。

Modules[ 0 ] よりも process.MainModule の方がかっこいいですね。
引用返信 編集キー/
■18843 / inTopicNo.5)  Re[2]: アプリケーション名の取得
□投稿者/ 渋木宏明(ひどり) (757回)-(2008/05/16(Fri) 17:19:17)
渋木宏明(ひどり) さんの Web サイト
> アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。

てことは、「実行ファイル名」ではダメだということですか?

ダメだとして、「いわゆるアプリケーション名」を取得する汎用的で確実な方法は存在しないです。

> アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。

って、確か昔(=Windows 95 以前=タスクバー搭乗前?)は逆だったよね>ガイドライン
引用返信 編集キー/
■18848 / inTopicNo.6)  Re[3]: アプリケーション名の取得
□投稿者/ とっちゃん (293回)-(2008/05/16(Fri) 17:56:54)
とっちゃん さんの Web サイト
No18843 (渋木宏明(ひどり) さん) に返信
>>アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。
>
> てことは、「実行ファイル名」ではダメだということですか?
>
> ダメだとして、「いわゆるアプリケーション名」を取得する汎用的で確実な方法は存在しないです。
>
>>アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。
>
> って、確か昔(=Windows 95 以前=タスクバー搭乗前?)は逆だったよね>ガイドライン

今はバラバラです。指針があるのかどうかも怪しいです。
おいらのマシンにあるソフトをいくつか見てみたところ...
#Spy++で、メインウィンドウのキャプション文字列を参照

アプリ名なし(エクスプローラ)
アプリ名が - の左:FileViser, RSS Bandit, Excel2007(メインウィンドウのキャプション),
アプリ名が - の右:VS, IEなど, Groove2007(起動バーのキャプション)
その他のパターン:秀丸メール

なので、類推はほぼ不可能でしょう。
ちなみに、Excelのキャプション部分は、メインウィンドウではありません。
Spy++で見てみればわかりますが、あのキャプション部分まで「含めて」リボンが構成されています。

引用返信 編集キー/
■18857 / inTopicNo.7)  Re[3]: アプリケーション名の取得
□投稿者/ れれれ (61回)-(2008/05/16(Fri) 18:55:38)
No18843 (渋木宏明(ひどり) さん) に返信
>>アクティブウィンドウのタイトルを取得して文字列の後ろから「-」がないか検索してあったらそこから文字列末端までがアプリケーション名というのが現在の案です。
>
> てことは、「実行ファイル名」ではダメだということですか?
>
実行ファイル名とはたとえば
C:\Program Files\Windows Media Player\wmplayer.exe
がパスだとしたら最後のwmplayer.exeのことですよね?

一番いいのは「Windows Media Player」と出力されるのが一番いいのですが、妥協案として実行ファイルも考慮に入れます。
引用返信 編集キー/
■19043 / inTopicNo.8)  Re[4]: アプリケーション名の取得
□投稿者/ れれれ (62回)-(2008/05/19(Mon) 15:51:52)
一応シャノンさんの意見を参考に作ってみました

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
       
        [DllImport("user32.dll")]
        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        private void timer_taskcheck_Tick(object sender, EventArgs e)
        {
            IntPtr hWnd = GetForegroundWindow();
            int processid;
            GetWindowThreadProcessId(hWnd, out processid);
            Process p = Process.GetProcessById(processid);
            MessageBox.Show(p.MainModule.FileVersionInfo.ProductName);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer_taskcheck.Start();
        }
これで私の要望どおりに出力されたので解決とさせていただきます
ありがとうございました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -