Перемещение окна с названием, которое соответствует шаблону в C#

Пример Установите размер и положение другого приложения в C# использует функцию API FindWindow, чтобы найти окно с данным заголовком. К сожалению, FindWindow находит только окно, если заголовок является точным совпадением. Если вы знаете только часть названия или если в заголовке есть дополнительные пробелы или другие символы, FindWindow не найдет его.

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

// Образец целевого окна для соответствия
// и найденный дескриптор и заголовок.
private static string MatchPattern;
private static IntPtr MatchedHandle;
private static string MatchedTitle;

// Возвращает список дескрипторов дескрипторов рабочего стола и заголовков.
public static void FindWindowTitleMatch(
   string pattern, out IntPtr handle, out string title)
{
    MatchPattern = pattern;
    MatchedHandle = IntPtr.Zero;
    MatchedTitle = "";

    EnumDesktopWindows(IntPtr.Zero, FilterCallback, IntPtr.Zero);

    handle = MatchedHandle;
    title = MatchedTitle;
}

Метод FindWindowTitleMatch сохраняет шаблон, который должен соответствовать переменной MatchPattern. Он также инициализирует значения MatchedHandle и MatchedTitle значениям по умолчанию, которые он вернет, если он не может найти соответствующее окно.

Затем метод вызывает метод EnumDesktopWindows, передавая ему метод FilterCallback как метод, который функция API должна вызывать для каждого из окон, которые он перечисляет.

После завершения EnumDesktopWindows программа копирует значения, содержащиеся в переменных MatchedHandle и MatchedTitle, в возвращаемые переменные метода.

В следующем коде показан метод FilterCallback, который вызывается функцией API EnumDesktopWindows.

// Выберите первое окно, которое соответствует целевому шаблону.
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)
    {
        if (title.Matches(MatchPattern))
        {
            MatchedHandle = hWnd;
            MatchedTitle = title;
            // Возвращаем false, чтобы указать, что мы
            // не нужно продолжать перечисление окон.
            return false;
        }
    }

    // Возвращаем true, чтобы указать, что мы
    // должен продолжать перечислять окна.
    return true;
}

Метод использует функцию API GetWindowText для получения заголовка текущего окна. Если окно видимо и заголовок не пуст, метод использует расширение строки Matches, чтобы определить, соответствует ли заголовок целевому шаблону. (Информацию о расширении строки Matches см. В Сделайте расширение строки, чтобы определить, соответствует ли строка регулярному выражению в C# .)

Если название соответствует, метод сохраняет свой дескриптор и заголовок в переменных MatchedHandle и MatchedTitle и возвращает false, чтобы сообщить EnumDesktopWindows, что нет необходимости продолжать перечисление окон. Если заголовок не соответствует, метод возвращает true, чтобы сообщить EnumDesktopWindows, что он еще не нашел совпадения и что он должен продолжить перечисление других окон.

После того, как он найдет соответствующее окно, основная программа использует метод SetWindowPlacement для восстановления окна, чтобы он не был сведен к минимуму или не был максимизирован. Затем он использует метод SetWindowPosition, чтобы переместить окно в нужную позицию.

Как в примере Установите другой размер и положение приложения в C# , будьте осторожны, когда вы перемещаете окна. Если вы переместите окно с экрана, вам нужно будет использовать эту программу или что-то подобное, чтобы вернуть ее.

Источник: http://csharphelper.com/blog/2016/12/move-a-window-with-a-title-that-matches-a-pattern-in-c/

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