我有2台显示器,我需要保存位置并应在屏幕上显示它被关闭。
有人建议如何让屏幕上,它是,并且在窗体加载它显示在屏幕上,其中的形式被关闭?
这些设置保存我在注册表中。
我有2台显示器,我需要保存位置并应在屏幕上显示它被关闭。
有人建议如何让屏幕上,它是,并且在窗体加载它显示在屏幕上,其中的形式被关闭?
这些设置保存我在注册表中。
最简单的方法是调用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]
,这将是很容易的序列化此信息到您的应用程序设置 ,然后打开下一次重新加载它。
我实现了一个类似的功能很多次。 所有你需要做的是保存Form.WindowState
, Form.Size
和Form.Loaction
属性时,窗体关闭,并打开表单时恢复它们。