Окно максимизации другого процесса в .NET - PullRequest
13 голосов
/ 31 декабря 2010

У меня есть дескриптор главного окна другого процесса в .net (proc.MainWindowHandle).Как мне максимизировать окно внутри .net?

Ответы [ 3 ]

22 голосов
/ 31 декабря 2010

Вы можете закрепить ShowWindow с помощью SW_SHOWMAXIMIZED, чтобы развернуть окно.

У Pinvoke.net есть запись для ShowWindow здесь .

Например,

// Pinvoke declaration for ShowWindow
private const int SW_SHOWMAXIMIZED = 3;

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

// Sample usage
ShowWindow(proc.MainWindowHandle, SW_SHOWMAXIMIZED);
1 голос
/ 31 декабря 2010

Вы также можете использовать SetWindowPlacement . дополнительная информация об этом на Pinvoke.net.

0 голосов
/ 10 июня 2016

У меня были некоторые проблемы с этим и, наконец, удалось решить.В моем случае у меня было приложение WinForm, которое должно было максимизировать или минимизировать приложение WPF.

Во-первых, нам нужно импортировать InteropServices

using System.Runtime.InteropServices;

Затем нам нужны методы для необходимых нам действий:

[DllImport("user32.dll")]
private static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WINDOWPLACEMENT lpwndpl);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

Далее мы можем проверить процесс с помощьюего имя, получить его расположение окна, а затем обновить его расположение окна:

/// <summary>
/// WINDOWPLACEMENT showCmd - 1 for normal, 2 for minimized, 3 for maximized, 0 for hide 
/// </summary>
public static void MaximizeProcessWindow(string processName)
{ 
    foreach (Process proc in Process.GetProcesses())
    {
        if (proc.ProcessName.Equals(processName))
        {
            try
            { 
                WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
                GetWindowPlacement(proc.MainWindowHandle, ref wp); 

                // Maximize window if it is in a normal state
                // You can also do the reverse by simply checking and setting 
                // the value of wp.showCmd
                if (wp.showCmd == 1)
                {
                    wp.showCmd = 3; 
                } 
                SetWindowPlacement(proc.MainWindowHandle, ref wp);                         
                break;
            }
            catch(Exception ex)
            {
                // log exception here and do something
            }
        }
    }
}

Вы также можете получить процесс по заголовку окна:

if (proc.MainWindowTitle.Equals(processTitle))

В зависимости от процесса, вашВозможно, приложение должно быть выполнено с правами администратора.Это можно сделать, добавив файл манифеста, а затем добавив следующую привилегию администратора:

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
...