Список окон рабочего стола на 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);

Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание. сайт PInvoke.NET - отличное место для изучения деклараций API.

Большинство из них достаточно просты, если немного сложнее. Пока вы не пытаетесь понять каждую деталь, вы должны быть в порядке. Примечание. сайт PInvoke.NET - отличное место для изучения деклараций 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;
    }
    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()
{
    List handles;
    List titles;
    DesktopWindowsStuff.GetDesktopWindowHandlesAndTitles(
        out handles, out titles);

    lstWindows.DataSource = titles;
}

Источник: http://csharphelper.com/blog/2016/08/list-desktop-windows-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector