質問: 2; ListView_SetItem((HWND)lParam, &item); return TRUE; } ``` ### 補足情報(FW/ツールのバージョンなど) Microsoft Visual C++ 2010 Express C言語 WIN32 ユニコードビルド Windows7
回答: Visual Studio に付属のウィンドウ解析用ツール Spy++ を使って軽く確認した限りですが、タスクマネージャーでは * `EnumWindows`APIで列挙できるトップレベルウィンドウの内、 * 現在Visibleのもので、 * ウィンドウスタイルが `WS_POPUP` **ではない**もの を表示しているようです。例としてEnumWindowProcの以下のコードで、タスクマネージャーでの表示に一致しました。(Windows 7 Ultimate 64ビット、Windows 10 Professional 64ビット で確認) ``` static BOOL CALLBACK EnumWindowsProc( _In_ HWND hwnd, _In_ LPARAM lParam ) { if (IsWindowVisible(hwnd)) { LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE); if ((style & WS_POPUP) == 0) { // 確認の為デバッグ端末へ出力 TCHAR sz[256 + 2]; GetWindowText(hwnd, sz, 256); lstrcat(sz, _T("\n")); OutputDebugString(sz); } } return TRUE; } ``` 以下の件ですが、 > > これだと自分の作った他のプログラムのタイトルがこれらのタイトル名と同じだった場合にそのプログラムのハンドルまで表示されなくなってしまいます。 > > > ウィンドウのタイトルバーに表示されているタイトル文字列は、`SetWindowText`を使って動的に変えることもでき、それで考えるとタイトルだけで判断するのは不十分とも言えます。厳密にするのであれば、タイトルだけでなく、ウィンドウクラス名や必要に応じてウィンドウの付帯情報(ウィンドウスタイルや親子関係)まで対象にすれば判別は可能だと思います。(質問者さんのコードでは、`GetClassName`でクラス名を取得していますね) なお、ウィンドウの解析に便利なツール Spy++は Visual Studio 2010 Professional版には付属していますが、質問者さんご利用のExpress版に付属しているかは分かりません。 **追記しました:(2019/04/20 14:28)** **ReactOS**と言うWindows互換を目指しクローンOSがあります。 Wikipedia - ReactOS そのタスクマネージャーのソースが参考になるかもしれません。 github - reactos / taskmgr このソース中の`EnumWindowsProc`関数の中で、 `/* Check and see if this is a top-level app window */`と言うコメント部分があり、ここでタスクマネージャーに表示しないものを選り分けています。Windows 7やWindows 10と同じ挙動とは限りませんが、先の私のコード例より、親ウィンドウやオーナーウィンドウ、拡張ウィンドウスタイルを意識するなど、選別条件が増えています。こちらのコードを参考にすること、お望みの挙動になるかもしれません。