Как задать размер и положение другого приложения в 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, чтобы установить размер и положение цели. Это может иметь некоторые нечетные побочные эффекты, если режим размера окна не соответствует его размеру. Например, если окно максимизировано, и вы установите его размер на нечто меньшее, чем на экране, тогда строка заголовка немного портится по краям.

Источник: http://csharphelper.com/blog/2016/12/set-another-applications-size-and-position-in-c/

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