C# 如何使用WinAPI覆盖另一个窗口

C# 如何使用WinAPI覆盖另一个窗口,c#,winapi,window,C#,Winapi,Window,我有两个窗口,或者更确切地说是窗口把手。我想得到一个窗口的位置和大小,并将它们应用到另一个窗口,以便第二个窗口完全覆盖第一个窗口。 现在我正在使用GetWindowRect()获取一个窗口的位置和大小,例如 IntPtr hWnd1 = some window handle; Rect rect = new Rect(); GetWindowRect(hWnd1, ref rect); 在谷歌搜索之后,我似乎不得不使用SetWindowPos()来移动和调整顶部的另一个窗口 SetWindow

我有两个窗口,或者更确切地说是窗口把手。我想得到一个窗口的位置和大小,并将它们应用到另一个窗口,以便第二个窗口完全覆盖第一个窗口。 现在我正在使用
GetWindowRect()
获取一个窗口的位置和大小,例如

IntPtr hWnd1 = some window handle;
Rect rect = new Rect();
GetWindowRect(hWnd1, ref rect);
在谷歌搜索之后,我似乎不得不使用
SetWindowPos()
来移动和调整顶部的另一个窗口

SetWindowPos(hWnd2, some coords here);

但是,我不知道如何将
GetWindowRect()
返回的
RECT
结构转换成我可以与
SetWindowPos()一起使用的坐标,任何帮助都非常感谢。

我想你必须将“左、上、右、下”转换为“X、Y、宽度、高度”:

更新 您可能应该使用GetWindowPlacement而不是GetWindowRect,如下所示:

WINDOWPLACEMENT place;
bool ok = GetWindowPlacement(hwndTarget, out place);
ok = SetWindowPos(hwndSrc, new IntPtr(0), place.NormalPosition.Left, place.NormalPosition.Top, place.NormalPosition.Width, place.NormalPosition.Height, SetWindowPosFlags.ShowWindow);
注意:只有当窗口处于“恢复”位置(未最大化)时,此操作才有效


我省略了互操作导入和结构,您可以在和中找到它

不,这似乎不起作用。它移动窗口,但坐标都是错误的,根本不匹配。@ron975您是对的,因为GetWindowRect()返回屏幕坐标,而SetWindowPos()需要客户端坐标,请检查更新的答案,您也可以使用它来设置窗口的位置。请参阅顶部关于参数是解释为屏幕坐标还是客户端坐标的注释。在转换为宽度和高度时,您不需要
+1
,因为在Windows中,按照惯例,矩形的右边缘和下边缘通常被视为排他。换句话说,坐标为(右,底部)位于矩形“尝试使用
hWnd2
上的
MoveWindow()
之外。它应该可以工作。
MoveWindow()
也有同样的问题,坐标已关闭,看起来像
WINDOWPLACEMENT place;
bool ok = GetWindowPlacement(hwndTarget, out place);
ok = SetWindowPos(hwndSrc, new IntPtr(0), place.NormalPosition.Left, place.NormalPosition.Top, place.NormalPosition.Width, place.NormalPosition.Height, SetWindowPosFlags.ShowWindow);