2017-08-06 6 views
0

どのようにC#でGUIを持つ実行中のアプリケーションをすべて一覧表示できますか?何らかのタスクバーを作ろうとしているので、どのプロセスが実行されているかを知る必要があります。もちろん、すべてのプロセスをリストすることはできません。なぜなら、それは完全な災害になるからです。私の考えは、 "在庫"タスクバーで起こっているように思えるので、GUIでプロセスをリストするだけです。C#GUIを持つ実行中のアプリケーションを一覧表示する

static IEnumerable<Process> WindowProcesses() 
{ 
    foreach(var proc in Process.GetProcesses()) 
    { 
     if(proc.MainWindowHandle != IntPtr.Zero) 
     { 
      yield return proc; 
     } 
    } 
} 

+0

デスクトップ上のすべてのウィンドウを表示するだけの解決策はありますか? –

+0

最小化されたものもリストアップすれば、それは完璧です。 「目に見える」ものだけであれば、それは本当の答えではありませんが、後でそれが必要になるので、それはまた評価されるでしょう。 –

+0

https://stackoverflow.com/questions/7268302/get-the-titles-of-all-open-windowsおよびhttps://stackoverflow.com/questions/1032933/enumerate-all-window-handles-on-を参照してください。デスクトップ –

答えて

-1

このコードは、ドロップダウンを記入し、選択によって最前面にそれを取得します、あなたはあなたがメインウィンドウを持っているすべてのプロセスを一覧表示することができ、この

[DllImport("User32.dll")] 
    static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow); 
    [DllImport("User32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr hWnd); 

    private void ListTask() 
    { 
     Process[] processes = Process.GetProcesses(); 
     foreach (Process process in Process.GetProcesses(). 
            Where(p => !string.IsNullOrEmpty(p.MainWindowTitle)).ToList()) 
      listBox1.Items.Add(process.ProcessName); 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Process p = new Process(); 
     string name = listBox1.SelectedItem.ToString(); 
     p = Process.GetProcessesByName(name)[0]; 
     const uint SWP_SHOWWINDOW = 0x0001; 
     ShowWindow(p.MainWindowHandle, SWP_SHOWWINDOW); 
     SetForegroundWindow(p.MainWindowHandle); 
     p.Dispose(); 
    } 
+0

1)すべてのプロセスを列挙しますが、質問者はGUIを持つプロセスのみを必要としました。 2) 'new Process()'にレンダントインスタンスを生成します。 3) 'GetProcessesByName'はあいまいで、不正なプロセスを返すことがあります。 – IllidanS4

+0

あなたは今すぐ確認できますか、私は自分の答えを更新しました –

+0

なぜタイトルをチェックしますか?ウィンドウに空のタイトルがある場合はどうなりますか? – IllidanS4

-1

ようにそれを行うことができますこれは、メインウィンドウを持つすべてのプロセスを列挙しますが、目に見えるウィンドウ(サービスなど)を持つすべてのプロセスを一覧表示するとは限りません。そのためには、EnumWindowsGetWindowThreadProcessIdをP/Invokeする必要があります。

関連する問題