vc++2008 Express Edition
Vista SP1
Alt+Tabでタスクバーにあるアプリケーションが表示されますが、
その中から、デスクトップを除いたアプリケーションのハンドルを
取得したいです。
EnumWindows()を使えばできると思うのですが、どうすればいいのでしょうか?
わからないのは、列挙の方法そのものですか?
それとも、その中からデスクトップを除く方法ですか?
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;
}
オーナーウィンドウがいるウィンドウはタスクバーに載らない。
例えばAboutダイアログや何とかのプロパティ
WS_EX_TOOLWINDOWがあるときはタスクバーに載らない。
返事が遅れてすみません。
オーナーウィンドウがいるいないはどうやって判断するのでしょうか?
GetWindow(hWnd, GW_OWNER);
でオーナーウィンドウのハンドルが取得できます。
NULL が返ってくれば、オーナーがいないということです。
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 さん。
頑張ってね。
金魚ちゃんさんのリンク先から、一応解決できました。
ありがとうございました。