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

时间:2009-06-05 14:38:13

标签: 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

#7导致窗口占据整个分辨率,因此它与任务栏重叠。

#8导致宽度大于分辨率(我看到窗口的右边缘显示在我的辅助显示器上)并且高度稍微过大,因此窗口部分重叠任务栏区域。看起来这是正确的,除了不考虑边缘的窗户装饰。

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

我可以使用我在#9中所拥有的内容并将其添加到我得到的高度30,但这感觉太像在其他配置中会破坏的黑客。似乎必须有一种方法可以正确获得可​​用的屏幕尺寸,但我无法在AutoHotkey中找到它。

作为参考,这似乎给了我在Java中所需要的东西:

Toolkit.getDefaultToolkit().getScreenSize();

2 个答案:

答案 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