2009-06-05 12 views
5

Próbuję napisać kilka prostych skryptów AutoHotkey do przenoszenia okien i mam problemy z uzyskaniem prawidłowych wartości rozmiaru ekranu.Uzyskiwanie dostępnego obszaru ekranu w trybie autouruchamiania

Próbuję uzyskać rozmiar użytecznego obszaru na ekranie (zazwyczaj pełna rozdzielczość ekranu minus pasek zadań, a może dowolne inne zadokowane okna, takie jak pasek boczny w systemie Vista). Żadna z metod, które znalazłem dla uzyskania szerokości ekranu, nie działa.

Żadna z 3 metod, które znalazłem, aby uzyskać rozmiar ekranu, nie daje mi odpowiednich wartości. Oto skrypt testu używam (działa na XP z paska zadań na dole przy domyślnym rozmiarze):

#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 powoduje, że okno do podjęcia pełnej rozdzielczości, więc zachodzi na pasek zadań.

# 8 powoduje, że szerokość jest większa niż rozdzielczość (widzę prawą krawędź okna na drugim monitorze), a wysokość jest nieco za duża, więc okno częściowo zachodzi na obszar paska zadań. Wygląda na to, że jest to poprawne, z wyjątkiem nieuwzględniania dekoracji okien na krawędziach.

# 9 wydaje się mieć prawidłową szerokość, ale wysokość jest za krótka. Wygląda na to, że odejmuje ona wysokość paska zadań od wysokości rozdzielczości, ale odejmuje od niej kolejne 30 pikseli.

Mogę po prostu użyć tego, co mam w # 9 i dodać 30 do wysokości, którą otrzymuję, ale to wydaje się zbyt podobne do hackowania, które może przerwać w innych konfiguracjach. Wygląda na to, że musi istnieć sposób na uzyskanie odpowiedniego rozmiaru ekranu, ale nie mogę go znaleźć w AutoHotkey.

Dla porównania, to wydaje się dać mi to czego potrzebuję w Javie:

Toolkit.getDefaultToolkit().getScreenSize(); 

Odpowiedz

4

mam coś pracuje w XP. Bierze pod uwagę tylko pasek zadań, więc prawdopodobnie nie zrobi tego, co należy, w Vista, gdy pasek boczny jest widoczny. Jednak działa niezależnie od tego, gdzie znajduje się pasek narzędzi.

Oto sposoby I utworzone, wraz z prostą metodą ResizeAndCenter który pokazuje ich zastosowanie:

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

Funkcje te są bardzo przydatne. Po prostu użyłem ich pod Windows 7 i działają pięknie. Dzięki. Twoje zdrowie! –

Powiązane problemy