Эта программа использует несколько функций API для отображения окон, работающих на рабочем столе системы. Чтобы упростить повторное использование кода, я выполнил ключевые процедуры static в классе static, поэтому вам не нужно создавать экземпляр класса для их использования.
В следующем коде показаны определения API, используемые программой. Они сообщают C#, какие библиотеки содержат указанные методы.
Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание.
- отличное место для изучения деклараций API.
Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание.
- отличное место для изучения деклараций API.
В следующем коде показаны основные вызовы API.
// Сохраним заголовки и дескрипторы окон в этих списках.
private static List WindowHandles;
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;
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()
List handles;
List titles;
DesktopWindowsStuff.GetDesktopWindowHandlesAndTitles(
out handles, out titles);
lstWindows.DataSource = titles;