Список окон рабочего стола на C#
Эта программа использует несколько функций API для отображения окон, работающих на рабочем столе системы. Чтобы упростить повторное использование кода, я выполнил ключевые процедуры static в классе static, поэтому вам не нужно создавать экземпляр класса для их использования.
В следующем коде показаны определения API, используемые программой. Они сообщают C#, какие библиотеки содержат указанные методы.
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount); [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] private static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam); // Определим тип делегата обратного вызова. private delegate bool EnumDelegate(IntPtr hWnd, int lParam);
Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание.
Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание.
...
В следующем коде показаны основные вызовы API.
// Сохраним заголовки и дескрипторы окон в этих списках. private static ListWindowHandles; private static List WindowTitles; // Возвращает список дескрипторов дескрипторов рабочего стола и заголовков. public static void GetDesktopWindowHandlesAndTitles( out List handles, out List titles) { WindowHandles = new List (); WindowTitles = new List (); if (!EnumDesktopWindows(IntPtr.Zero, FilterCallback, IntPtr.Zero)) { handles = null; titles = null; } else { handles = WindowHandles; titles = WindowTitles; } }
Этот код определяет списки для хранения дескрипторов и названий окон. Затем он вызывает функцию API EnumDesktopWindows. Эта функция возвращает true, если она успешна, и false в противном случае. Если функция возвращает false, то метод GetDesktopWindowHandlesAndTitles возвращает null списки. Если функция API возвращает true, тогда метод возвращает найденные значения.
Итак, где именно в этом коде обрабатываются дескрипторы окон и заголовки окон в коллекциях WindowHandles и WindowTitles? Это происходит с помощью метода обратного вызова.
Когда код вызывает EnumDesktopWindows, он передает в качестве параметра следующий метод FilterCallback. Функция API EnumDesktopWindows вызывает FilterCallback для каждого найденного окна рабочего стола.
// Мы используем эту функцию для фильтрации окон. // Эта версия выбирает видимые окна с названиями. private static bool FilterCallback(IntPtr hWnd, int lParam) { // Получить заголовок окна. StringBuilder sb_title = new StringBuilder(1024); int length = GetWindowText(hWnd, sb_title, sb_title.Capacity); string title = sb_title.ToString(); // Если окно видно и имеет заголовок, сохраните его. if (IsWindowVisible(hWnd) && string.IsNullOrEmpty(title) == false) { WindowHandles.Add(hWnd); WindowTitles.Add(title); } // Возвращаем true, чтобы указать, что мы // должен продолжать перечислять окна. return true; }
Метод FilterCallback проверяет окна, найденные с помощью функции API EnumDesktopWindows, и затем может что-то с ними делать. В этом примере метод получает заголовок окна и вызывает функцию API IsWindowVisible, чтобы увидеть, видно ли окно. Если окно видно и имеет непустой заголовок, метод сохраняет дескриптор окна и заголовок в списках WindowHandles и WindowTitles.
Метод FilterCallback проверяет окна, найденные с помощью функции API EnumDesktopWindows, и затем может что-то с ними делать. В этом примере метод получает заголовок окна и вызывает функцию API IsWindowVisible, чтобы увидеть, видно ли окно. Если окно видно и имеет непустой заголовок, метод сохраняет дескриптор окна и заголовок в списках WindowHandles и WindowTitles.
...
// Отображение списка названий окон рабочего стола. private void ShowDesktopWindows() { Listhandles; List titles; DesktopWindowsStuff.GetDesktopWindowHandlesAndTitles( out handles, out titles); lstWindows.DataSource = titles; }