2009-06-05 18 views
5

Sto provando a scrivere alcuni semplici script AutoHotkey per spostare le finestre, e ho problemi a ottenere i valori di dimensione dello schermo corretti.Ottieni area dello schermo in autohotkey

Sto cercando di ottenere la dimensione dell'area utilizzabile sullo schermo (generalmente la risoluzione a schermo intero meno la barra delle applicazioni e forse qualsiasi altra finestra ancorata come la barra laterale in Vista). Nessuno dei metodi che ho trovato per ottenere la larghezza dello schermo sembra funzionare.

Nessuno dei 3 metodi che ho trovato per ottenere le dimensioni dello schermo mi stanno dando i valori corretti. Ecco lo script di test che sto usando (in esecuzione su XP con barra delle applicazioni in basso alla sua dimensione predefinita):

#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 fa sì che la finestra per prendere l'intera risoluzione, in modo che si sovrappone alla barra delle applicazioni.

# 8 fa sì che la larghezza sia maggiore della risoluzione (vedo il bordo destro della finestra visualizzato sul mio monitor secondario) e l'altezza è leggermente troppo grande, quindi la finestra si sovrappone parzialmente all'area della barra delle applicazioni. Sembra che questo sia corretto tranne che non tenendo conto delle decorazioni della finestra ai bordi.

# 9 sembra avere la larghezza corretta, ma l'altezza è troppo breve. Sembra che stia sottraendo l'altezza della barra delle applicazioni dall'altezza della risoluzione, ma poi sottraendo altri 30 pixel da esso.

Potrei semplicemente usare quello che ho in # 9 e aggiungere 30 all'altezza che ottengo, ma mi sembra troppo simile a un hack che si spezzerebbe in altre configurazioni. Sembra che ci debba essere un modo per ottenere correttamente le dimensioni dello schermo disponibili, ma non riesco a trovarlo in AutoHotkey.

Per avere un riferimento, questo sembra darmi quello che mi serve in Java:

Toolkit.getDefaultToolkit().getScreenSize(); 

risposta

4

ho qualcosa lavorando in XP. Attualmente prende in considerazione solo la barra delle applicazioni, quindi probabilmente non farà la cosa giusta in Vista quando la barra laterale è visibile. Tuttavia, funziona indipendentemente da dove si trova la barra degli strumenti.

Questi sono i metodi che ho creato, insieme a un metodo semplice ResizeAndCenter che mostra il loro uso:

; 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

Queste funzioni sono molto utili. Li abbiamo appena usati con Windows 7 e funzionano magnificamente. Grazie. Saluti! –

Problemi correlati