2014-02-18 33 views
1

我有2個窗口,或者更確切地說是窗口句柄。我想獲得一個窗口的位置和大小,並將它們應用到另一個窗口,以便第二個窗口完全覆蓋第一個窗口。 現在我使用GetWindowRect()得到一個窗口的位置和大小,例如,如何使用WinAPI覆蓋另一個窗口

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

和一些google搜索後,看來我必須使用SetWindowPos()到移動和調整上面有我的另一個窗口。

SetWindowPos(hWnd2, some coords here); 

不過,我不知道如何通過GetWindowRect()返回到座標我可以SetWindowPos()使用RECT結構轉換,任何幫助表示讚賞。

+0

嘗試使用'的MoveWindow()''上hWnd2'。它應該工作。 – user1793036

+0

'MoveWindow()'有同樣的問題,座標關閉,它看起來像http://images.punyman.com/uploads/c4e4a299ce6b9f0770b2.png – ron975

回答

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.html找到並http://www.pinvoke.net/default.aspx/user32/SetWindowPos.html

+0

不,這似乎並沒有工作。它移動窗口,但座標都是錯誤的,根本不匹配。 – ron975

+0

@ ron975你是對的,因爲* GetWindowRect()*返回*屏幕座標*和* SetWindowPos()*期望*客戶端座標*,請檢查更新的答案 – thepirat000

+0

您也可以使用[MoveWindow](http:// msdn .microsoft.com/en-us/library/windows/desktop/ms633534(v = vs.85).aspx)來設置窗口的位置。查看頂部的註釋是否將參數解釋爲屏幕或客戶端座標。 –