8

ウィンドウを移動するためのいくつかの簡単な 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();
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 に答える