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

时间:2014-02-18 01:35:10

标签: c# winapi window

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

IntPtr hWnd1 = some window handle;
Rect rect = new Rect();
GetWindowRect(hWnd1, ref rect);

经过一些谷歌搜索后,似乎我必须使用SetWindowPos()移动并调整我的其他窗口的大小。

SetWindowPos(hWnd2, some coords here);

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

1 个答案:

答案 0 :(得分:1)

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

RECT rct = GetWindowRect(windowHandler);
SetWindowPos(windowHandler, HWND_TOP, rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top, SWP_SHOWWINDOW);

更新

您可能应该使用 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);

请注意,这仅在窗口处于“恢复”位置(未最大化)时才有效。

我省略了互操作导入和结构,您可以在http://www.pinvoke.net/default.aspx/user32/GetWindowPlacement.htmlhttp://www.pinvoke.net/default.aspx/user32/SetWindowPos.html找到它