起動中のタスク(アプリケーション)の取得方法

[戻る]
ヒサ 2002/05/01(水) 18:38:29
はじめまして。ヒサと申します。
Win2000/VC++6.0を使って、MFCで開発しています。
Windowsタスクマネージャのアプリケーション画面に出ているような
アプリケーション(タスク)の一覧を取得するには、
どのような方法があるでしょうか?
どなたかご教授願いますでしょうか。
よろしくお願いします。

Bun 2002/05/01(水) 18:51:00
EnumWindows で過去のログを検索してみましょう。

概要はMSDNを参照してください。

ヒサ 2002/05/02(木) 11:46:32
Bunさんありがとうございます。
もう少し教えてください。
EnumWindowsパラメータのコールバック関数内で
アプリケーション(タスク)の一覧を取得するのでしょうか?
どのような方法で行うのでしょうか?
単純にコールバック関数をカウントすると大きな値になってしまいます。
よろしくお願いします。

Bun 2002/05/02(木) 13:05:01
EnumProcesses()、 EnumProcessModules()、 GetModuleFileNameEx()、 
GetModuleBaseName() 

このあたりを使うようです。
やったことがないので、できるかどうかわかりませんが(自信なし)
NTの例が下記のページで紹介されています。

http://www.microsoft.com/japan/support/kb/articles/J041/6/32.htm

YuO [E-Mail] 2002/05/02(木) 15:21:42
>EnumWindowsパラメータのコールバック関数内で
>アプリケーション(タスク)の一覧を取得するのでしょうか?

EnumWindowsは,トップレベルウィンドウを列挙するAPIです。
疑似コードを書くと,
BOOL EnumWindows(WNDENUMPROC ep, LPARAM lp)
{
    for (全てのトップレベルウィンドウについて) {
        if (!(*ep)(あるトップレベルウィンドウのハンドル, lp)) return FALSE;
    }
    return TRUE;
}
ということを行っています。

タスクというのは,
・OWNERがいない(GetWindow(hWnd, GW_OWNER) == NULL))
・可視(IsWindowVisible(hWnd) == TRUE)
・タイトル有り(GetWindowTextLength(hWnd) > 0)
の条件を満たす物ですから,それを満たすウィンドウをコールバック中で記録してやれば
よいです。


>単純にコールバック関数をカウントすると大きな値になってしまいます。

何をやったのでしょう……?


>NTの例が下記のページで紹介されています。

えーっと,KB JP175030(旧 J041632)では,タスクの列挙はほとんど扱っていないんです
よね……。
ここのコードはGetVersionExでプラットフォームをチェックしているので,95系・NT系ど
ちらでも動きます。
ちなみに,ToolHelp APIはNT系でもWindows 2000からサポートされるようになったので,
NT 4.0及びそれ以前のOSを切り捨てればToolHelpのみで列挙可能です。

ヒサ 2002/05/02(木) 16:53:05
[[解決]]
Bunさん、YuOさんありがとうございました。
YuOさんの方法でうまく動作しました。

Bun 2002/05/02(木) 18:12:22
>ToolHelp APIはNT系でもWindows 2000からサポートされるようになったので,
>NT 4.0及びそれ以前のOSを切り捨てればToolHelpのみで列挙可能です。

ふーん、そうなんですか。

解決後ですけど

このような情報はどちらから取得されているのでしょうか?

YuO [E-Mail] 2002/05/02(木) 18:18:18
>このような情報はどちらから取得されているのでしょうか?

どこかの掲示板かMLでみかけたのだと思います。
すでにどこから,などの事は忘れましたが,確認はMSDN引けばできますし。

CreateToolhelp32Snapshot
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/toolhelp_5450.asp
> Windows NT/2000/XP: Included in Windows 2000 and later.
> Windows 95/98/Me: Included in Windows 95 and later.

Bun 2002/05/02(木) 18:30:59
Yu0さん

>どこかの掲示板かMLでみかけたのだと思います。

そういうことですね。

>> Windows NT/2000/XP: Included in Windows 2000 and later.

了解です。
情報ありがとうございました。

Bun 2002/05/02(木) 18:33:52
>タスクというのは,
>・OWNERがいない(GetWindow(hWnd, GW_OWNER) == NULL))
>・可視(IsWindowVisible(hWnd) == TRUE)
>・タイトル有り(GetWindowTextLength(hWnd) > 0)
>の条件を満たす物ですから

すみません、もーいっちょ。m(__)m

この条件はどこで見つけられたのでしょうか?

YuO [E-Mail] 2002/05/02(木) 19:45:57
>この条件はどこで見つけられたのでしょうか?

こっちは書籍です。

Win32 プログラミングテクニック VC++5.0対応
油谷実紀・平見知久著 秀和システム ISBN4-87966-752-8


Knowledge Base等の公式の物は探したんですが,見つかりませんでした。

Bun 2002/05/02(木) 20:12:45
>Knowledge Base等の公式の物は探したんですが,見つかりませんでした。

わざわざ、すみません。
ありがとうございました。m(__)m

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