Her*_*rms 7 windows 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
Run Code Online (Sandbox Code Playgroud)
#7使窗口占据整个分辨率,因此它与任务栏重叠.
#8导致宽度大于分辨率(我看到窗口的右边缘显示在我的辅助监视器上)并且高度稍微过大,因此窗口部分重叠任务栏区域.看起来这是正确的,除了没有考虑边缘的窗户装饰.
#9似乎有正确的宽度,但高度太短.看起来它正在从分辨率的高度减去任务栏的高度,但是从它减去另外30个像素.
我可以使用我在#9中的内容并将其添加到我所获得的高度30,但这感觉太像在其他配置中会破坏的黑客.似乎必须有一种方法来正确获得可用的屏幕尺寸,但我无法在AutoHotkey中找到它.
作为参考,这似乎给了我在Java中需要的东西:
Toolkit.getDefaultToolkit().getScreenSize();
Run Code Online (Sandbox Code Playgroud)
我在 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
}
Run Code Online (Sandbox Code Playgroud)