Плитка настольных окон в строках и столбцах в C#

Пример Список окон рабочего стола на C# показывает, как перечислить в настоящее время работает Windows. В этом примере этот метод используется для заполнения ListBox заголовками этих окон рабочего стола. (См. Предыдущий пример, чтобы увидеть, как работает эта часть.) Если вы выберете некоторые из них и нажмите «Упорядочить», этот пример упорядочивает их по строкам и столбцам на экране.

Программа хранит информацию о каждом рабочем окне в следующей структуре WindowInfo.

// Отобразите заголовок окна, сохранив его дескриптор.
private struct WindowInfo
{
    public string Title;
    public IntPtr Handle;

    public WindowInfo(string title, IntPtr handle)
    {
        Title = title;
        Handle = handle;
    }

    // Отображение заголовка.
    public override string ToString()
    {
        return Title;
    }
}

Эта структура просто хранит дескриптор рабочего стола и заголовок. Структура переопределяет метод ToString, чтобы вернуть заголовок, чтобы ListBox отображал заголовок.

Следующий код показывает, как программа упорядочивает окна рабочего стола.

// Расположите выбранные элементы управления.
private void btnArrange_Click(object sender, EventArgs e)
{
    if (lstWindows.SelectedItems.Count == 0) return;

    // Получить расположение и размеры формы.
    int screen_top = Screen.PrimaryScreen.WorkingArea.Top;
    int screen_left = Screen.PrimaryScreen.WorkingArea.Left;
    int screen_width = Screen.PrimaryScreen.WorkingArea.Width;
    int screen_height = Screen.PrimaryScreen.WorkingArea.Height;

    // Посмотрим, насколько большими будут окна.
    int window_width = (int)(screen_width / nudCols.Value);
    int window_height = (int)(screen_height / nudRows.Value);

    // Располагаем окна.
    int window_num = 0;
    int y = screen_top;
    for (int row = 0; row < nudRows.Value; row++)
    {
        int x = screen_left;
        for (int col = 0; col < nudCols.Value; col++)
        {
            // Восстановить окно.
            WindowInfo window_info =
                (WindowInfo)lstWindows.SelectedItems[window_num];
            DesktopWindowsStuff.SetWindowPlacement(
                window_info.Handle,
                DesktopWindowsStuff.ShowWindowCommands.Restore);

            // Положение окна window_num;
            DesktopWindowsStuff.SetWindowPos(window_info.Handle,
                x, y, window_width, window_height);

            // Если это последнее окно, верните.
            if (++window_num >= lstWindows.SelectedItems.Count)
                return;
            x += window_width;
        }
        y += window_height;
    }
}

Этот код сначала получает рабочую область экрана - область, не включающая панель задач. Затем он делит ширину и высоту экрана на нужное количество столбцов и строк, чтобы увидеть, насколько большой он должен сделать каждое окно.

Затем программа проходит через строки и столбцы. В каждой внутренней итерации он получает структуру WindowInfo следующего элемента. Он вызывает функцию API SetWindowPlacement для восстановления окна (поэтому он не максимизирован или не минимизирован), передавая функцию дескриптору окна. Затем код позиционирует окно в следующем (x, y) значении и устанавливает его размер.

Источник: http://csharphelper.com/blog/2016/12/tile-desktop-windows-in-rows-and-columns-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector