Целевое окно, как минимизировать, увеличить или восстановить его в C#
Это первая в серии записей, которая позволяет одному приложению манипулировать целевым окном в другом приложении. Обратите внимание, что это не то, что Microsoft действительно хочет, чтобы вы сделали. В общем случае одно приложение не должно возиться с другим приложением. Поскольку это не одобрено Microsoft, поддержка манипуляции целевым окном в другом приложении невелика.
Эта программа находит целевое окно в другом приложении и сводит к минимуму, максимизирует или восстанавливает его.
В этом примере используются несколько функций и структур API. Их определения длинны, поэтому я не буду включать их всех здесь. Загрузите пример, чтобы увидеть их. Ниже перечислены объявления API.
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); internal static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl); static extern bool SetWindowPlacement(IntPtr hWnd, internal struct WINDOWPLACEMENT internal enum ShowWindowCommands : int public struct POINT public struct RECT
Когда вы нажимаете кнопку «Установить», выполняется следующий код.
// Установите место размещения цели. private void btnSet_Click(object sender, EventArgs e) { // Получить дескриптор целевого окна. IntPtr target_hwnd = FindWindowByCaption(IntPtr.Zero, txtAppTitle.Text); if (target_hwnd == IntPtr.Zero) { MessageBox.Show( "Could not find a window with the title \"" + txtAppTitle.Text + "\""); return; } // Подготовьте структуру WINDOWPLACEMENT. WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); placement.Length = Marshal.SizeOf(placement); // Получить текущее место размещения окна. GetWindowPlacement(target_hwnd, out placement); // Установите действие места размещения. if (radMaximized.Checked) placement.ShowCmd = ShowWindowCommands.ShowMaximized; else if (radMinimized.Checked) placement.ShowCmd = ShowWindowCommands.ShowMinimized; else placement.ShowCmd = ShowWindowCommands.Normal; // Выполните действие. SetWindowPlacement(target_hwnd, ref placement); }
В коде используется функция API FindWindowByCaption для поиска целевого окна. Обратите внимание, что вы должны правильно ввести заголовок целевого окна или FindWindowByCaption не найдет его.
Далее код получает текущее местоположение целевого окна. Перед вызовом GetWindowPlacement (или SetWindowPlacement) код должен сохранить размер структуры WINDOWPLACEMENT в свойстве Length. Код делает это, а затем вызывает GetWindowPlacement.
Программа оставляет все поля WINDOWPLACEMENT отдельно, за исключением свойства ShowCmd, которое он устанавливает для максимизации, минимизации или восстановления цели.
Наконец, код вызывает SetWindowPlacement, чтобы дать цели новое состояние.