我如何获得一个表格,并显示在屏幕上的位置,并恢复所显示的下一次我的形式?(How do I get

2019-10-16 16:48发布

我有2台显示器,我需要保存位置并应在屏幕上显示它被关闭。

有人建议如何让屏幕上,它是,并且在窗体加载它显示在屏幕上,其中的形式被关闭?

这些设置保存我在注册表中。

Answer 1:

最简单的方法是调用GetWindowPlacement功能 。 返回一个WINDOWPLACEMENT结构包含有关窗口的屏幕坐标信息。

使用此功能代替的Form.Location财产解决问题,你有多个显示器,最小化的窗口,奇怪的是位于任务栏等体验

攻击的路线会调用GetWindowPlacement当应用程序被关闭功能,坚持窗口的位置到注册表(或任何你存储它,注册表不再保存应用程序状态的推荐地点),并那么当你的应用程序被重新打开,调用相应的SetWindowPlacement功能的窗口恢复到原来的位置。

由于这些是由Win32 API暴露的原生功能,并且你在C#中的工作,你需要通过P / Invoke来调用它们。 以下是所需的定义(用于组织的目的,我建议在静态类名为将这些NativeMethods ):

[StructLayout(LayoutKind.Sequential)]
struct POINT
{
    public int X;
    public int Y;
}

[StructLayout(LayoutKind.Sequential)]
struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[Serializable]
[StructLayout(LayoutKind.Sequential)]
struct WINDOWPLACEMENT
{
     public int length;
     public int flags;
     public int showCmd;
     public POINT ptMinPosition;
     public POINT ptMaxPosition;
     public RECT rcNormalPosition; 
}

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

[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

为了让您的窗口的当前位置(这时候你的应用程序被关闭,你会做),使用此代码:

WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
wp.length = Marshal.SizeOf(wp);
GetWindowPlacement(MyForm.Handle, ref wp);

我提到的注册表召回不再是持续的应用程序状态所推荐的地方。 既然你在.NET开发,你可以看到更多强大和灵活的选项。 而且,由于WINDOWPLACEMENT上述声明的类被标记为[Serializable] ,这将是很容易的序列化此信息到您的应用程序设置 ,然后打开下一次重新加载它。



Answer 2:

我实现了一个类似的功能很多次。 所有你需要做的是保存Form.WindowStateForm.SizeForm.Loaction属性时,窗体关闭,并打开表单时恢复它们。



文章来源: How do I get the position of a form and the screen it is displayed on, and restore that the next time my form is displayed?