10

C# で開いているタスクを取得する方法を見つけようとしています。私はグーグルで検索してきましたが、プロセスのリストを取得する方法しか見つかりません。タスクバーに表示されるタスクのみが必要です。

また、それに伴い、タスクが関連付けられているプロセスを取得できればクールです。可能であれば、次の画像のように、Vista が ALT-TAB メニューに使用するサムネイル画像を取得します。

Altタブ

これを行うためのライブラリが既に存在するようには見えないため、pinvokes を使用する必要があると思います。何か案は?

4

4 に答える 4

5

この記事では、何をすべきかを正確に説明する必要があります。独自のタスク スイッチを作成する方法を示し、すべてのウィンドウを列挙してそれらが「タスク」であるかどうかを判断するために必要なコードを示し、PrintWindow API を使用してXP でのプレビュー。

http://msdn.microsoft.com/en-us/library/ms997649.aspx

また、Alt+Tab ビューに何が表示されるかを決定するために使用されるアルゴリズムについて説明しているブログ投稿もここにあります。基本的に、ウィンドウに所有者がいるかどうかとともに、WS_EX_APPWINDOW と WS_EX_TOOLWINDOW を確認する必要があります。

于 2008-11-24T19:44:32.643 に答える
5

API (Win32) の観点からは、タスクのようなものはありません (少なくとも、Windows タスク マネージャー/Alt-Tab が表示するものはありません)。

これらの「タスク」は、実際にはトップレベルのウィンドウです。

したがって、それらのリストを取得するには、ウィンドウを列挙する必要があります(これはそのためのPInvokeです)。

次に、ウィンドウのスタイルを調べて、実際にトップ レベルのウィンドウかどうかを判断します。

于 2008-11-21T22:51:07.697 に答える
1

試したことはありませんが、次のようなことが疑われます。

using System.Diagnostics;
static void MyFunc()
{
    Process[] processes = Process.GetProcesses();
    foreach(Process p in processes)
    {
       if (p.MainWindowHandle != 0)
       { // This is a GUI process
       }
       else
       { // this is a non-GUI / invisible process
       }
    }
}

ポイントは、各プロセスで WindowHandle をチェックすることです。

于 2008-11-21T22:55:03.867 に答える
0

@abelenky17

これですべてのケースがカバーされるわけではないと思います。たとえば、複数のトップ レベル ウィンドウを持つプロセスがあります (すべてタスク マネージャーに表示されます)。たとえば、FireFox、Windows Explorer、IE などを考えてみましょう。これらのアプリケーションは、デスクトップ上に複数のウィンドウを持つことができます。また、ターミナル セッション シナリオを適切に処理しません (システムで実行されているすべてのプロセスを列挙するため)。

@ダンC。

このようなことをする:

p.ProcessName != "explorer"

大丈夫だと思いますか?においがする、まずい。

于 2008-11-21T23:03:39.780 に答える