我正在尝试编写一些简单的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();
答案 0 :(得分:4)
我在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
}
答案 1 :(得分:3)
您是否尝试过使用SysGet的MonitorWorkArea子命令? http://www.autohotkey.com/docs/commands/SysGet.htm