【问题标题】:How can I control the size and position of a new process Window from a WinForms app?如何从 WinForms 应用程序控制新进程窗口的大小和位置?
【发布时间】:2011-03-20 06:57:16
【问题描述】:

我的 WinForms 应用程序使用 Process.Start() 在其本机应用程序中打开文件。我想将屏幕一分为二,一半显示我的 WinForms 应用程序,另一半显示新进程。我知道我可以使用Process.MainWindowHandle 来获取窗口句柄,但是如何设置它的大小和位置呢?

我想我必须使用某种 Windows API,但使用哪一种以及如何使用?由于这并不是真正的“在我的驾驶室”,我不确定是否(以及如何)我需要在 64 位 Windows 上使用不同的 API。

【问题讨论】:

    标签: c# windows winforms 32bit-64bit


    【解决方案1】:

    有问题的 Windows API 方法是 SetWindowPos。你可以这样声明:

    [DllImport("user32.dll")]
    private extern static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
    

    并在此处阅读: http://msdn.microsoft.com/en-us/library/ms633545.aspx

    已添加

    Process.MainWindowHandle 是您将使用的 hWnd 参数。 hWndInsertAfter 可能是您自己的表单句柄(Form.Handle)。 您可以使用屏幕类型来访问有关桌面的信息: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx

    添加了托马斯的评论

    在调用 SetWindowPos 之前确保您 WaitForInputIdle。

    Process process = Process.Start(...);
    if (process.WaitForInputIdle(15000))
        SetWindowPos(process.MainWindowHandle, this.Handle, ...);
    

    上面的 SetWindowPos 声明适用于 32 位和 64 位 Windows。

    【讨论】:

    • 在尝试调整窗口大小之前,您可能需要在进程上调用 WaitForInputIdle...
    • Thomas,这正是我所需要的!
    • 您可能想添加 Thomas 关于Process.WaitForInputIdle 的一点。如果你这样做,我会将此标记为答案。此外,这也是 Win32 API 的一部分。它可以在 64 位操作系统上运行吗?
    • @flipdoubt:Win32 只是 API 的俗称;它的所有设施也可以在 64 位上运行。正式名称是“Windows API”。
    • 在这里你可以找到一个使用枚举作为标志的版本,它也有 XML cmets:pinvoke.net/default.aspx/user32.setwindowpos
    猜你喜欢
    • 2010-12-05
    • 2011-06-13
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多