Как вывести список активных окон приложения с помощью C #

Мне нужно иметь возможность перечислить все активные приложения на компьютере с Windows. Я использовал этот код ...

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

пока я не понял, что это не перечисляет случаи, такие как WORD или ACROREAD, когда несколько файлов открываются каждый в своем собственном окне. В этой ситуации только самое верхнее окно перечислено с использованием вышеупомянутой техники. Я предполагаю, что это потому, что существует только один процесс, даже если два (или более) файла открыты. Итак, я думаю, мой вопрос: как мне перечислить все окна, а не их основной процесс?

Ответы на вопрос(1)

Решение Вопроса

Pinvoke, используя EnumWindows в user32.dll. что-то вроде этого будет делать то, что вы хотите.

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);
}

Ваш ответ на вопрос