8

我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口,但我无法获得正确的屏幕尺寸值。

我正在尝试获取屏幕上可用区域的大小(通常是全屏分辨率减去任务栏,也可能是任何其他停靠窗口,如 Vista 中的侧边栏)。我发现的两种获取屏幕宽度的方法似乎都不起作用。

我发现的三种获取屏幕尺寸的方法都没有给我正确的值。这是我正在使用的测试脚本(在 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();
4

2 回答 2

5

我得到了一些在 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
}
于 2009-06-11T18:57:11.227 回答
3

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

于 2010-05-23T05:44:54.947 回答