如何使用C#列出活动的应用程序窗口

时间:2012-05-30 15:38:00

标签: c# windows

我需要能够在Windows机器上列出所有活动的应用程序。 我一直在使用这段代码......

  Process[] procs = Process.GetProcesses(".");
  foreach (Process proc in procs)
  {
      if (proc.MainWindowTitle.Length > 0)
      {
          toolStripComboBox_StartSharingProcessWindow.Items.Add(proc.MainWindowTitle);
      }
  }

直到我意识到当在他们自己的窗口中打开多个文件时,这不会列出像WORD或ACROREAD这样的情况。在那种情况下,使用上述技术仅列出最顶层的窗口。我假设这是因为即使打开了两个(或更多)文件,也只有一个进程。所以,我想我的问题是:如何列出所有窗口而不是其底层进程?

2 个答案:

答案 0 :(得分:5)

在user32.dll中使用EnumWindows进行pinvoke。这样的事情会做你想要的。

public delegate bool WindowEnumCallback(int hwnd, int lparam);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumWindows(WindowEnumCallback lpEnumFunc, int lParam);

[DllImport("user32.dll")]
public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount);

[DllImport("user32.dll")]
public static extern bool IsWindowVisible(int h);

private List<string> Windows = new List<string>();
private bool AddWnd(int hwnd, int lparam)
{
    if (IsWindowVisible(hwnd))
    {
      StringBuilder sb = new StringBuilder(255);
      GetWindowText(hwnd, sb, sb.Capacity);
      Windows.Add(sb.ToString());          
    }
    return true
}

private void Form1_Load(object sender, EventArgs e)
{
    EnumWindows(new WindowEnumCallback(this.AddWnd), 0);
}

答案 1 :(得分:0)

我做了一个类似的方法,但它也过滤窗口样式 ToolWindow 和隐藏的窗口存储应用程序,这些应用程序通过伪装来绕过隐藏标志。

public static class WindowFilter
{
    public static bool NormalWindow(IWindow window)
    {
        if (IsHiddenWindowStoreApp(window,  window.ClassName)) return false;

        return !window.Styles.IsToolWindow && window.IsVisible;
    }

    private static bool IsHiddenWindowStoreApp(IWindow window, string className) 
        => (className == "ApplicationFrameWindow" || className == "Windows.UI.Core.CoreWindow") && window.IsCloaked;
}

上面的例子是github的一个项目的一部分,你可以看到其余的代码。 https://github.com/mortenbrudvik/WindowExplorer