【问题标题】:Get available screen area in autohotkey在自动热键中获取可用的屏幕区域
【发布时间】:2010-10-31 16:05:50
【问题描述】:

我正在尝试编写一些简单的 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,但这感觉太像一个会破坏其他配置的 hack。似乎必须有一种方法可以正确获取可用的屏幕尺寸,但我在 AutoHotkey 中找不到它。

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

Toolkit.getDefaultToolkit().getScreenSize();

【问题讨论】:

    标签: windows autohotkey


    【解决方案1】:

    我得到了一些在 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 下使用它们,它们就可以很好地工作。谢谢。干杯!
    【解决方案2】:

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

    【讨论】:

    • SysGet, OutputVar, MonitorWorkArea, 21::MsgBox, % OutputVar 什么都不返回。有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2021-12-27
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多