计算机上的位置坐标显示X = -32000,Y = -32000

时间:2009-09-25 18:02:41

标签: c# .net windows

我有一个C#应用程序,它在关闭时保存其状态,然后在启动时读取保存状态。保存的一个项目是主窗体的位置。通常这很好 - 在我的代码中有一行这样的行将位置保存到文件中,然后在启动时读回:

streamWriter.WriteLine("location:" + this.Location.X + "," + this.Location.Y);

通常情况下,位置坐标在我的机器上看起来像这样,有多个显示器:

location:-1069,283

偶尔我会看到像这样保存的坐标:

location:-32000,-32000

然后当用户重新启动应用程序时,表单离桌面很远,普通用户无法(轻松)检索。

如何以这种方式读取坐标并且是否有建议来防止这种情况?

3 个答案:

答案 0 :(得分:8)

您看到的坐标是由于应用程序在关闭时被最小化的事实。 Windows通过实际将其从坐标移动到一些非常大的负X,Y坐标来“隐藏”您的表单。

以编程方式验证:

Vista上的表单应用输出:

当前坐标X:184 Y:184 *默认位置 当前坐标X: - 32000 Y: - 32000 *最小化位置

来自代码:

System.Diagnostics.Debug.WriteLine(“当前坐标X:”+ Location.X +“Y:”+ Location.Y);

要解决这个问题,我只会在您的应用关闭时检查这样的值,而不是实际将其保存到文件中。

如果您不想在任意坐标值上进行数学操作,您还可以检查WindowState。见here on MSDN

答案 1 :(得分:4)

使用表单上的RestoreBounds属性。

编辑:这是我的一些代码的复制/粘贴(可能会使用一些清理,但它得到了重点)。这是来自我的主窗体的FormClosing事件处理程序:

// Save the last form state
Program.AppSettings.MainWindowFormState = this.WindowState;

// Check if the window is minimized or maximized
if ((this.WindowState == FormWindowState.Minimized) ||
    (this.WindowState == FormWindowState.Maximized))
{
    // Use the restored state values
    Program.AppSettings.MainWindowX = this.RestoreBounds.Left;
    Program.AppSettings.MainWindowY = this.RestoreBounds.Top;
    Program.AppSettings.MainWindowWidth = this.RestoreBounds.Width;
    Program.AppSettings.MainWindowHeight = this.RestoreBounds.Height;
}
else
{
    // Use the normal state values
    Program.AppSettings.MainWindowX = this.Left;
    Program.AppSettings.MainWindowY = this.Top;
    Program.AppSettings.MainWindowWidth = this.Width;
    Program.AppSettings.MainWindowHeight = this.Height;
}

以下是如何在加载时恢复状态(记得将表单的初始位置模式设置为Manual以避免闪烁):

// Set the initial form state
this.WindowState = Program.AppSettings.MainWindowFormState;
this.Left = Program.AppSettings.MainWindowX;
this.Top = Program.AppSettings.MainWindowY;
this.Width = Program.AppSettings.MainWindowWidth;
this.Height = Program.AppSettings.MainWindowHeight;

答案 2 :(得分:0)

回答主要问题" 正在发生的事情":

我发现在应用程序运行时按下Ctrl + D可轻松复制(=最小化所有窗口并查看桌面的快捷方式)。

当您的窗口被最小化并且您立即设置window.Visible = False时,您将获得两个坐标(top,left) = -32000。此尝试不正确,因为窗口已经最小化(=隐藏)并且您正在双重更改坐标。

相反,您应该设置更正确的window.ShowInTaskbar = False,并且coord -32000的问题会消失。