Как задать размер и положение другого приложения в C#
Когда я пишу книги, обычно существует максимальный размер, который может быть снят с экрана. Я написал эту программу, чтобы упростить установку примерной программы точно такого размера.
Эта программа использует функцию API FindWindow, чтобы найти целевое окно и функцию API SetWindowPos для его размера и размещения. Следующий код показывает, как программа определяет эти функции. Он также определяет перечисление SetWindowPosFlags, используемое SetWindowPos.
// Определить функцию API FindWindow. [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); // Определим функцию API SetWindowPos. [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags); // Определим перечисление SetWindowPosFlags. [Flags()] private enum SetWindowPosFlags : uint { SynchronousWindowPosition = 0x4000, DeferErase = 0x2000, DrawFrame = 0x0020, FrameChanged = 0x0020, HideWindow = 0x0080, DoNotActivate = 0x0010, DoNotCopyBits = 0x0100, IgnoreMove = 0x0002, DoNotChangeOwnerZOrder = 0x0200, DoNotRedraw = 0x0008, DoNotReposition = 0x0200, DoNotSendChangingEvent = 0x0400, IgnoreResize = 0x0001, IgnoreZOrder = 0x0004, ShowWindow = 0x0040, }
Эта программа не устанавливает флаги, но я включил их здесь, если они вам понадобятся. Если вы не хотите их, вы можете определить последний параметр в SetWindowPos как тип uint, а затем просто передать значение 0.
Когда вы нажимаете кнопку «Установить», программа выполняет следующий код.
// Размер и расположение приложения. 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; } // Установите позицию окна. int width = int.Parse(txtWidth.Text); int height = int.Parse(txtHeight.Text); int x = int.Parse(txtX.Text); int y = int.Parse(txtY.Text); SetWindowPos(target_hwnd, IntPtr.Zero, x, y, width, height, 0); }
Программа использует FindWindow, чтобы найти дескриптор целевого приложения. Это работает только в том случае, если вы точно введете заголовок окна целевого приложения.
Затем программа использует SetWindowPos, чтобы установить размер и положение цели. Это может иметь некоторые нечетные побочные эффекты, если режим размера окна не соответствует его размеру. Например, если окно максимизировано, и вы установите его размер на нечто меньшее, чем на экране, тогда строка заголовка немного портится по краям.