我有一个Windows应用程序(我用C#编写),它以一个没有边框的最大化窗口开始。
当用户点击应用程序中的按钮时,我想恢复窗口(即移除最大化状态),将其调整为特定大小并将其移动到屏幕的右下角。 / p>
我的问题是,在正确调整窗口大小的同时调用SetWindowPos()
并不总是将其放在屏幕的右下角。有时它确实如此,但有时候窗口被放置在屏幕的其他位置(几乎就像它是#34;跳跃"周围,因为我忽略的原因)。
我做错了什么?
这是我的代码。请注意,我将-1作为第二个参数传递给SetWindowPos,因为我希望我的窗口位于每个其他窗口的顶部。
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;
}
答案 0 :(得分:6)
你应该删除这些行:
NativePoint point = new NativePoint { x = x, y = y };
ClientToScreen(handler, ref point);
将您的电话改为:
SetWindowPos(handler, -1, x, y, 380, 250, 0);
调用ClientToScreen()
毫无意义,因为您拥有的坐标已经是屏幕坐标。
您的窗口每次都会有不同的位置,因为当您拨打ClientToScreen()
时,它会在窗口的当前位置上创建基于的新坐标。这意味着每次调用函数时坐标都会不同。
另外,如果您想考虑任务栏的大小,则应使用Screen.WorkingArea
property代替SystemParameters.PrimaryScreen***
:
int x = (int)(Screen.PrimaryScreen.WorkingArea.Width - 380);
int y = (int)(Screen.PrimaryScreen.WorkingArea.Height - 250);