最大化另一个进程'Window in .NET

时间:2010-12-30 22:06:57

标签: .net windows-process

我在.net(proc.MainWindowHandle)的另一个进程'主窗口上有一个句柄。如何最大化.net内的窗口?

3 个答案:

答案 0 :(得分:22)

您可以使用SW_SHOWMAXIMIZED对ShowWindow进行pinvoke以最大化窗口。

Pinvoke.net有一个ShowWindow here的条目。

例如,

// 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 :(得分:1)

您也可以使用SetWindowPlacement。在Pinvoke.net上有关于它的further info

答案 2 :(得分:0)

我遇到了一些问题,终于设法解决了。在我的情况下,我有一个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" />