2017-08-06 36 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

相关问题