EnumWindows()でタスクバーにあるアプリケーションを列挙するには?

[戻る]
nsf 2009/12/08(火) 07:30:49
vc++2008 Express Edition
Vista SP1

Alt+Tabでタスクバーにあるアプリケーションが表示されますが、
その中から、デスクトップを除いたアプリケーションのハンドルを
取得したいです。
EnumWindows()を使えばできると思うのですが、どうすればいいのでしょうか?

aetos 2009/12/10(木) 13:31:44
わからないのは、列挙の方法そのものですか?
それとも、その中からデスクトップを除く方法ですか?

nfs 2009/12/12(土) 12:15:23
aetosさん、お返事ありがとうございます。
返信遅くなり申し訳ありません。

一応、下記のようにすれば、まあまあ期待通りの動きをするのですが、
PStart.exe(http://www.pegtop.net/start/)を起動している状態だと、
PStartを2回拾ってしまいます。
タスクバーにあるアプリケーションのみを列挙する一般的な方法があれば、
教えてください。

BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM LParam)
{
    char szWindow[260];
    char szClass[260];
    if(IsWindowVisible(hWnd))
    {
        GetWindowText(hWnd, szWindow, 259);
        GetClassName(hWnd, szClass, 259);    
        if(strcmp(szClass, "Button")        // スタートを排除
        && strcmp(szClass, "Shell_TrayWnd") // タスクバーを排除
        && strcmp(szClass, "Progman"))      // プログラムマネージャーを排除
        {// ここで、外部アプリのハンドルを取得する            
        }
    }
    return TRUE;
}

wclrp ( 'o') 2009/12/12(土) 20:57:29
オーナーウィンドウがいるウィンドウはタスクバーに載らない。
例えばAboutダイアログや何とかのプロパティ

WS_EX_TOOLWINDOWがあるときはタスクバーに載らない。

nsf 2009/12/23(水) 05:52:17
返事が遅れてすみません。
オーナーウィンドウがいるいないはどうやって判断するのでしょうか?

Bull 2009/12/24(木) 12:34:50
GetWindow(hWnd, GW_OWNER);
でオーナーウィンドウのハンドルが取得できます。
NULL が返ってくれば、オーナーがいないということです。

金魚ちゃん 2010/01/03(日) 17:31:54
2010年の新年。
あけましておめでとう。
最初の回答をするぞ。

・指定ウインドウの状態
http://blog.goo.ne.jp/masaki_goo_2006/e/b5d91ab7568499da2c1aefb85b44fc24

・トップレベル・ウインドウの列挙
http://blog.goo.ne.jp/masaki_goo_2006/e/c620ad58b0d818c530d09d5ce361189d

・可視ウインドウの列挙
http://blog.goo.ne.jp/masaki_goo_2006/e/e6586cd582874300c0e97e12a1056415

・特定アプリケーションの列挙
http://blog.goo.ne.jp/masaki_goo_2006/e/f4a960eba4c54fb573428acd57d61a44

[補足]
上記のブログでは WS_EX_TOOLWINDOW フラグを調査していないので調査したり、
Windows Vista ではダイアログも列挙されるため上記のブログ記事のようにします。

> タスクバーにあるアプリケーションのみを列挙する一般的な方法があれば、
> 教えてください。
たぶん。一発列挙はないと思う。
だから上記のブログ記事のように頑張って実装。
でも Windows のバージョンによって挙動が違うから。
どこまで対応するかは作り手の問題。

じゃあ nfs さん。
頑張ってね。

nsf 2010/01/06(水) 23:58:16
[[解決]]
金魚ちゃんさんのリンク先から、一応解決できました。
ありがとうございました。

古いスレッドには追加発言できません。