Используя код WPF в Windows 10, как получить все окна (не только окна верхнего уровня) запущенных в данный момент программ? - PullRequest
0 голосов
/ 11 июля 2019

В настоящее время я работаю над программой переключения приложений, которая должна переключаться между всеми окнами запущенных приложений (не только окнами верхнего уровня) в Windows 10. Возможно ли это в WPF?

Пока чтоЯ попытался выполнить итерацию каждого процесса, полученного при вызове Process.GetProcesses ().

Process[] processList = Process.GetProcesses();

foreach(Process process in processList){
  // code 
}

Используя этот API, я смог получить только MainWindowHandle и MainWindowTitle из объекта процесса.Вместо этого я бы хотел получить заголовок окна, которое также не находится на верхнем уровне.

Например: если у меня открыто два окна Google Chrome, у меня будет доступ к заголовкам каждого из окон, а не только к верхнему уровню или к последнему использовавшемуся окну.

До сих пор я рассматривал использование EnumWindows , но заметил, что в Windows 10 это будет возвращать только окно верхнего уровня.

1 Ответ

0 голосов
/ 11 июля 2019

Вы должны использовать EnumChildWindows .

Это должно выглядеть примерно так:

Сначала создайте вспомогательный класс для WinApi:

class WindowManager
{
    public delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);


    //this one would iterate through child windows of window
    public static bool IterateChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam)
    {
        return EnumChildWindows(window, callback, lParam);
    }

}

Теперь вы можете вызывать IterateChildWindows. OnEnumWindow - это метод, который будет вызываться для каждого найденного окна. Обратите внимание, что окно также является кнопкой, текстовым полем и т. Д .:

WindowManager.IterateChildWindows(hwnd, OnEnumWindow, IntPtr.Zero);

bool OnEnumWindow(IntPtr foundWindow, IntPtr lParam)
{

   //here you have to check if this window is a form or a control and then do your work           
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...