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