【问题标题】:How to use WinAPI to cover another window如何使用 WinAPI 覆盖另一个窗口
【发布时间】:2014-02-18 01:35:09
【问题描述】:

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

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

经过一番谷歌搜索后,似乎我必须使用SetWindowPos() 来移动和调整顶部的另一个窗口的大小。

SetWindowPos(hWnd2, some coords here);

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

【问题讨论】:

标签: c# winapi window


【解决方案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 中找到它

【讨论】:

  • 不,这似乎不起作用。它移动了窗口,但坐标都错了,根本不匹配。
  • @ron975 你是对的,因为 GetWindowRect() 返回 屏幕坐标SetWindowPos() 期望 客户坐标,请查看更新后的答案
  • 你也可以使用MoveWindow来设置窗口的位置。有关参数是被解释为屏幕坐标还是客户端坐标,请参阅顶部的注释。
  • 在转换为宽度和高度时不需要+1,因为在Windows “按照惯例,矩形的右边缘和下边缘通常被认为是互斥的。换句话说, 坐标为 (right, bottom) 的像素位于矩形外"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2016-07-08
  • 1970-01-01
相关资源
最近更新 更多