windows - Få tilgængelig skærmområde i autohotkey

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive et par enkle AutoHotkey-scripts til at flytte vinduer rundt, og jeg har problemer med at få de rigtige skærmstørrelsesværdier.


Jeg forsøger at få størrelsen på det anvendelige område på skærmen (generelt den fulde skærmopløsning minus proceslinjen og måske andre dockede vinduer som sidebjælken i Vista). Ingen af ​​de metoder, jeg har fundet for at få skærmen bredde ser ud til at virke.


Ingen af ​​de 3 metoder, jeg fandt at få skærmens størrelse, giver mig de rigtige værdier. Her er test scriptet, jeg bruger (kører på XP med proceslinjen i bunden ved standardstørrelsen):


#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 får vinduet til at tage hele opløsningen op, så den overlapper proceslinjen.


# 8 får bredden til at være større end opløsningen (jeg ser vinduets højre kant op på min sekundære skærm), og højden er lidt for stor, så vinduet overlapper delvist proceslinjen. Det ser ud til at dette er korrekt, undtagen for ikke at tage hensyn til vinduesdekorationerne ved kanterne.


# 9 synes at have den korrekte bredde, men højden er for kort. Det ser ud til, at det s trækker proceslinjens højde fra opløsningens højde, men trækker derefter yderligere 30 pixels fra det.


Jeg kunne bare bruge hvad jeg har i # 9 og tilføje 30 til den højde jeg får, men det føles for meget som et hack, der ville bryde i andre konfigurationer. Det ser ud som om der skal være en måde at få den tilgængelige skærmstørrelse korrekt på, men jeg kan ikke finde den i AutoHotkey.


Til reference synes dette at give mig det, jeg har brug for i Java:


Toolkit.getDefaultToolkit().getScreenSize();

Bedste reference


Jeg har noget, der arbejder i XP. Det tager i øjeblikket kun hensyn til proceslinjen, så det har sikkert ikke vundet det rigtige i Vista, når sidebjælken er synlig. Det virker dog, uanset hvor værktøjslinjen er.


Her er de metoder, jeg oprettede, sammen med en simpel ResizeAndCenter-metode, der viser deres brug:


; 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
}

Andre referencer 1


Har du forsøgt at bruge SysGet 's underkommando til MonitorWorkArea?

http://www.autohotkey.com/docs/commands/SysGet.htm[4]