SetWindowPos 每次移动 window 到不同的位置
SetWindowPos moves window to different position every time
我有一个 Windows 应用程序(我用 C# 编写),它以最大化的 window 开始,没有边框。
当用户在应用程序中点击一个按钮时,我想恢复window(即去掉最大化状态),调整到一定大小并移动到右下方屏幕一角。
我的问题是,在正确调整 window 大小时,调用 SetWindowPos()
并不总是将其置于屏幕的右下角。有时确实如此,但有时 window 被放置在屏幕上的其他地方(几乎就像 "jumping" 一样,原因我忽略了)。
我做错了什么?
这是我的代码。请注意,我将 -1 作为第二个参数传递给 SetWindowPos,因为我希望我的 window 位于所有其他 window.
之上
public void MoveAppWindowToBottomRight()
{
Process process = Process.GetCurrentProcess();
IntPtr handler = process.MainWindowHandle;
ShowWindow(handler, 9); // SW_RESTORE = 9
int x = (int)(System.Windows.SystemParameters.PrimaryScreenWidth - 380);
int y = (int)(System.Windows.SystemParameters.PrimaryScreenHeight - 250);
NativePoint point = new NativePoint { x = x, y = y };
ClientToScreen(handler, ref point);
SetWindowPos(handler, -1, point.x, point.y, 380, 250, 0);
}
[StructLayout(LayoutKind.Sequential)]
public struct NativePoint
{
public int x;
public int y;
}
您应该删除这些行:
NativePoint point = new NativePoint { x = x, y = y };
ClientToScreen(handler, ref point);
并将您的呼叫更改为:
SetWindowPos(handler, -1, x, y, 380, 250, 0);
调用 ClientToScreen()
没有任何意义,因为您的坐标已经是屏幕坐标。
您的 window 每次都会获得不同的位置,因为当您调用 ClientToScreen()
时,它将根据 根据 window 的当前位置[=30] 创建新坐标=].这意味着每次调用函数时坐标都会不同。
此外,如果您想考虑任务栏的大小,您应该使用 Screen.WorkingArea
property 而不是 SystemParameters.PrimaryScreen***
:
int x = (int)(Screen.PrimaryScreen.WorkingArea.Width - 380);
int y = (int)(Screen.PrimaryScreen.WorkingArea.Height - 250);
我有一个 Windows 应用程序(我用 C# 编写),它以最大化的 window 开始,没有边框。
当用户在应用程序中点击一个按钮时,我想恢复window(即去掉最大化状态),调整到一定大小并移动到右下方屏幕一角。
我的问题是,在正确调整 window 大小时,调用 SetWindowPos()
并不总是将其置于屏幕的右下角。有时确实如此,但有时 window 被放置在屏幕上的其他地方(几乎就像 "jumping" 一样,原因我忽略了)。
我做错了什么?
这是我的代码。请注意,我将 -1 作为第二个参数传递给 SetWindowPos,因为我希望我的 window 位于所有其他 window.
之上public void MoveAppWindowToBottomRight()
{
Process process = Process.GetCurrentProcess();
IntPtr handler = process.MainWindowHandle;
ShowWindow(handler, 9); // SW_RESTORE = 9
int x = (int)(System.Windows.SystemParameters.PrimaryScreenWidth - 380);
int y = (int)(System.Windows.SystemParameters.PrimaryScreenHeight - 250);
NativePoint point = new NativePoint { x = x, y = y };
ClientToScreen(handler, ref point);
SetWindowPos(handler, -1, point.x, point.y, 380, 250, 0);
}
[StructLayout(LayoutKind.Sequential)]
public struct NativePoint
{
public int x;
public int y;
}
您应该删除这些行:
NativePoint point = new NativePoint { x = x, y = y };
ClientToScreen(handler, ref point);
并将您的呼叫更改为:
SetWindowPos(handler, -1, x, y, 380, 250, 0);
调用 ClientToScreen()
没有任何意义,因为您的坐标已经是屏幕坐标。
您的 window 每次都会获得不同的位置,因为当您调用 ClientToScreen()
时,它将根据 根据 window 的当前位置[=30] 创建新坐标=].这意味着每次调用函数时坐标都会不同。
此外,如果您想考虑任务栏的大小,您应该使用 Screen.WorkingArea
property 而不是 SystemParameters.PrimaryScreen***
:
int x = (int)(Screen.PrimaryScreen.WorkingArea.Width - 380);
int y = (int)(Screen.PrimaryScreen.WorkingArea.Height - 250);