2017-08-06 40 views
0

如何列出所有在C#中具有GUI的正在運行的應用程序?我正在嘗試製作某種任務欄,因此我必須知道哪些進程正在運行。我無法列出所有過程,因爲那將是一場完全災難。我的想法是隻用gui列出進程,因爲這看起來像是在「股票」任務欄中發生的事情。C#列出正在運行的具有GUI的應用程序

+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

您可以列出有一個主窗口中的所有流程:

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

這將枚舉所有具有主窗口的進程,但可能不一定列出具有任何可見窗口的所有進程(例如服務)。爲此,您需要P/Invoke EnumWindowsGetWindowThreadProcessId

相關問題