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