在autohotkey中获取可用的屏幕区域

问题描述:

我正在尝试编写几个用于移动窗口的简单AutoHotkey脚本,并且无法获得正确的屏幕大小值。在autohotkey中获取可用的屏幕区域

我试图让屏幕上的可用区域的大小(通常是全屏幕分辨率减去任务栏,也可能是任何其他停靠的窗口,如Vista中的侧边栏)。我找到的获取屏幕宽度的方法都无效。

我发现获得屏幕尺寸的3种方法都没有给我正确的值。这里的测试脚本我使用(在其默认大小底部的任务栏上的XP上运行):

#7:: 
WinMove A,,0,0,A_ScreenWidth,A_ScreenHeight 
return 

#8:: 
;SM_CXMAXIMIZED and SM_CYMAXIMIZED 
SysGet, ScreenWidth, 61 
SysGet, ScreenHeight, 62 
WinMove A,,0,0,ScreenWidth,ScreenHeight 
return 

#9:: 
;SM_CXFULLSCREEN and SM_CYFULLSCREEN 
SysGet, ScreenWidth, 16 
SysGet, ScreenHeight, 17 
WinMove A,,0,0,ScreenWidth,ScreenHeight 
return 

#7导致窗口占据整个分辨率,使其重叠任务栏。

#8导致宽度大于分辨率(我看到窗口的右边显示在辅助监视器上),高度稍大,所以窗口部分重叠任务栏区域。看起来这是正确的,除非不考虑边缘处的窗饰。

#9似乎有正确的宽度,但高度太短。它看起来像是从分辨率的高度减去任务栏的高度,但是从中减去另外30个像素。

我可以使用我在#9中的内容,并将30增加到我得到的高度,但这种感觉太像是一种破解其他配置的破解。似乎必须有一种方法才能正确获得可​​用的屏幕大小,但我无法在AutoHotkey中找到它。

以供参考,这似乎给我什么,我需要在Java中:

Toolkit.getDefaultToolkit().getScreenSize(); 

我得到的东西在XP中工作。它目前只考虑任务栏,所以在侧栏可见时,它可能不会在Vista中做正确的事情。但是,无论工具栏在哪里,它都可以工作。

这里是我创造的方法,以及用一个简单的方法ResizeAndCenter,显示它们的用途:

; Gets the edge that the taskbar is docked to. Returns: 
; "top" 
; "right" 
; "bottom" 
; "left" 
GetTaskbarEdge() { 
    WinGetPos,TX,TY,TW,TH,ahk_class Shell_TrayWnd,,, 

    if (TW = A_ScreenWidth) { ; Vertical Taskbar 
    if (TY = 0) { 
     return "top" 
    } else { 
     return "bottom" 
    } 
    } else { ; Horizontal Taskbar 
    if (TX = 0) { 
     return "left" 
    } else { 
     return "right" 
    } 
    } 
} 

GetScreenTop() { 
    WinGetPos,TX,TY,TW,TH,ahk_class Shell_TrayWnd,,, 
    TaskbarEdge := GetTaskbarEdge() 

    if (TaskbarEdge = "top") { 
    return TH 
    } else { 
    return 0 
    } 
} 

GetScreenLeft() { 
    WinGetPos,TX,TY,TW,TH,ahk_class Shell_TrayWnd,,, 
    TaskbarEdge := GetTaskbarEdge() 

    if (TaskbarEdge = "left") { 
    return TW 
    } else { 
    return 0 
    } 
} 

GetScreenWidth() { 
    WinGetPos,TX,TY,TW,TH,ahk_class Shell_TrayWnd,,, 
    TaskbarEdge := GetTaskbarEdge() 

    if (TaskbarEdge = "top" or TaskbarEdge = "bottom") { 
    return A_ScreenWidth 
    } else { 
    return A_ScreenWidth - TW 
    } 
} 

GetScreenHeight() { 
    WinGetPos,TX,TY,TW,TH,ahk_class Shell_TrayWnd,,, 
    TaskbarEdge := GetTaskbarEdge() 

    if (TaskbarEdge = "top" or TaskbarEdge = "bottom") { 
    return A_ScreenHeight - TH 
    } else { 
    return A_ScreenHeight 
    } 
} 

ResizeAndCenter(w, h) 
{ 
    ScreenX := GetScreenLeft() 
    ScreenY := GetScreenTop() 
    ScreenWidth := GetScreenWidth() 
    ScreenHeight := GetScreenHeight() 

    WinMove A,,ScreenX + (ScreenWidth/2)-(w/2),ScreenY + (ScreenHeight/2)-(h/2),w,h 
} 
+0

这些功能非常有用。刚刚在Windows 7下使用它们,它们的工作非常漂亮。谢谢。干杯! – 2012-05-13 10:58:26

您是否尝试过使用SysGet的MonitorWorkArea子命令?
http://www.autohotkey.com/docs/commands/SysGet.htm