Окно максимизации другого процесса в.NET
У меня есть дескриптор главного окна другого процесса в.net (proc.MainWindowHandle). Как мне максимизировать окно внутри.net?
3 ответа
Вы можете закрепить 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);
У меня были некоторые проблемы с этим и, наконец, удалось решить. В моем случае у меня было приложение 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" />
Вы также можете использовать SetWindowPlacement. Есть дальнейшая информация об этом на Pinvoke.net.