gpt4 book ai didi

c# - SetWindowPos 每次将窗口移动到不同的位置

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:16 31 4
gpt4 key购买 nike

我有一个 Windows 应用程序(我用 C# 编写的),它以无边框的最大化窗口开始。

当用户点击应用程序中的某个按钮时,我想恢复窗口(即移除最大化状态),将其调整到一定大小并将其移动到屏幕的右下角。

我的问题是,调用 SetWindowPos() 时,在正确调整窗口大小时,并不总是将其置于屏幕的右下角。有时它确实如此,但有时窗口被放置在屏幕上的其他地方(几乎就像它在“跳来跳去”,原因我忽略了)。

我做错了什么?

这是我的代码。请注意,我将 -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;
}

最佳答案

你应该删除这些行:

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);

关于c# - SetWindowPos 每次将窗口移动到不同的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572522/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com