Autohotkey 如何发现最大化的窗口';恢复位置坐标?

Autohotkey 如何发现最大化的窗口';恢复位置坐标?,autohotkey,Autohotkey,正如标题所示,我试图发现当用户将最大化父窗口从最大化状态恢复时,将在何处重新绘制最大化父窗口。现在,我可以通过使用winRestore命令来实现这一点,捕获位置,然后再次WinMaximize,但这会导致窗口a)在绘制两次时闪烁,b)对于我希望用户即时看到的过程来说,时间太长(稍后将窗口移动到另一个屏幕时,我使用恢复的位置) 我相当肯定我使用GetWindowsPlacement Windows API方法走的是正确的道路,但我愿意承认,弄清楚如何获得我需要的信息是我目前的dllCalling编

正如标题所示,我试图发现当用户将最大化父窗口从最大化状态恢复时,将在何处重新绘制最大化父窗口。现在,我可以通过使用winRestore命令来实现这一点,捕获位置,然后再次WinMaximize,但这会导致窗口a)在绘制两次时闪烁,b)对于我希望用户即时看到的过程来说,时间太长(稍后将窗口移动到另一个屏幕时,我使用恢复的位置)

我相当肯定我使用GetWindowsPlacement Windows API方法走的是正确的道路,但我愿意承认,弄清楚如何获得我需要的信息是我目前的dllCalling编码能力之外的一步,而谷歌搜索没有发现任何东西

简而言之:我想做的是获取并设置(在Windows窗口管理系统中)任何窗口恢复位置的左上角坐标,而无需实际重新绘制和移动最大化窗口


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

UserLexikos演示了如何通过对GetWindowPlacement的DLL调用来实现:


您的用例是什么?也许还有另一种方法可以实现所需的功能。我想增强一个简单的“将窗口移动到下一个屏幕”功能。如果一个窗口没有最大化(X-pos+屏幕宽度=新的X-pos),这很容易做到,但在屏幕上发送一个最大化的窗口也不会移动其恢复的位置,我试图发现它将恢复到哪里,同时避免使用winRestore move WinMaximize时涉及的窗口绘制闪烁,然后操纵堆栈,使窗口直接恢复到新监视器。在恢复移动最大值之前,我尝试使窗口透明,但速度太慢。Cirieno-我有一些自动热键代码,用于在两个监视器之间移动窗口。如果窗口最大化:我首先恢复它,进行移动,然后再次最大化它。这可能需要1-2秒,但它可以工作。如果这听起来对你有用,请给我的“deanhill1971”Gmail帐户发电子邮件。@Dean:这正是我为自己写的代码。一个正常化的窗口会在瞬间从一个监视器跳到另一个监视器,但恢复移动最大化的速度仍然太慢(不仅仅是因为我必须在执行R-Mv-Mx过程之前使窗口透明)。但谢谢你的提议。这是一个很好的选择,它能为最大化的窗口提供一个正常的位置。好发现!现在我(也许)需要弄清楚如何设置这些值!。。
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
}