我怎样才能发现一个最大化窗口的恢复位置坐标?

问题描述:

正如标题所暗示的,我试图发现当用户从最大化状态恢复时,最大化父窗口将被重新绘制的位置。现在,我可以通过使用winRestore命令来执行此操作,捕获该位置,然后再次winMaximise,但这会导致窗口a)闪烁,因为它会被绘制两次,并且b)需要太长的时间来处理我想要立即执行的过程给用户(我在稍后将窗口移动到另一个屏幕时使用恢复的位置)。我怎样才能发现一个最大化窗口的恢复位置坐标?

我很确定我在GetWindowsPlacement Windows API方法的正确路径,但我愿意承认,搞清楚如何获得我需要的信息是超出我当前的dllCalling编码能力的一个步骤,谷歌搜索没有发现任何东西。

简而言之:我想要做的是获取并设置(进入Windows窗口管理系统)任意窗口的恢复位置的左上角坐标,而不会实际重绘和移动最大化的窗口。

有没有人有我可以遵循的方向或指针?谢谢!

+0

什么是你的使用情况?也许还有另一种方法来实现所需的功能。 – DevinB 2010-08-23 17:59:27

+0

我想增强一个简单的“将窗口移动到下一个屏幕”功能。如果一个窗口没有被最大化(X-pos + screenwidth = new X-pos),但是在屏幕上发送一个最大化的窗口并不会移动它的恢复位置,我很容易做到这一点,我试图发现它将恢复到哪里同时避免使用winRestore-move-winMaximise涉及的窗口画面闪烁,然后操作堆栈以便窗口直接恢复到新的监视器。我尝试在恢复移动最大化之前使窗口变为透明,但速度太慢。 – 2010-08-24 08:56:42

+0

Cirieno - 我有一些AutoHotkey代码用于在两台显示器之间移动窗口。如果窗口最大化:我先恢复它,然后移动,然后再次最大化。这可能需要1-2秒,但是它可以工作。如果这听起来对您有用,请发送电子邮件至我的“deanhill1971”Gmail帐户。 – 2010-11-22 19:28:10

用户Lexikos展示了如何用一个DLL调用GetWindowPlacement做到这一点:

http://www.autohotkey.com/forum/post-172836.html#172836

hwnd := WinExist("Untitled - Notepad") 
WinGetPos, mX, mY 
WinGetNormalPos(hwnd, x, y, w, h) 
MsgBox Pos:`nx: %mX%`ny: %mY%`n`nNormalPos:`nx: %x%`ny: %y%`nw: %w%`nh: %h% 

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w="", ByRef h="") 
{ 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "uint", hwnd, "uint", &wp) 
    x := NumGet(wp, 28, "int") 
    y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x 
    h := NumGet(wp, 40, "int") - y 
} 
+0

这是现货,用于获得最大化窗口的标准化位置。好找!现在我(也许)需要弄清楚如何设置这些值! – 2011-02-10 10:19:45

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633544(v=vs.85).aspx – 2014-02-19 23:28:03