2009-06-05 5 views
5

J'essaie d'écrire quelques scripts AutoHotkey simples pour déplacer les fenêtres et j'ai de la difficulté à obtenir les valeurs de taille d'écran correctes. J'essaie d'obtenir la taille de la zone utilisable sur l'écran (généralement la résolution en plein écran moins la barre des tâches, et peut-être toutes les autres fenêtres ancrées comme la barre latérale dans Vista). Aucune des méthodes que j'ai trouvées pour obtenir la largeur de l'écran ne semble fonctionner.Obtenir la zone d'écran disponible dans autohotkey

Aucune des 3 méthodes que j'ai trouvées pour obtenir la taille de l'écran ne me donne les bonnes valeurs. Voici le script de test que je utilise (en cours d'exécution sur XP avec la barre des tâches en bas à sa taille par défaut):

#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, la fenêtre pour prendre toute la résolution, de sorte qu'il chevauche la barre des tâches. La largeur est supérieure à la résolution (je vois que le bord droit de la fenêtre apparaît sur mon moniteur secondaire) et la hauteur est légèrement trop grande, de sorte que la fenêtre chevauche partiellement la zone de la barre des tâches. On dirait que c'est correct, sauf pour ne pas prendre en compte les décorations de fenêtre sur les bords.

# 9 semble avoir la bonne largeur, mais la hauteur est trop courte. Il semble que l'on soustrait la hauteur de la barre des tâches de la hauteur de la résolution, mais en soustrayant 30 autres pixels de celle-ci.

Je pourrais juste utiliser ce que j'ai dans # 9 et ajouter 30 à la hauteur que je reçois, mais cela ressemble trop à un hack qui casserait dans d'autres configurations. Il semble qu'il doit y avoir un moyen d'obtenir la taille d'écran disponible correctement, mais je ne peux pas le trouver dans AutoHotkey.

Pour référence, cela semble me donner ce que je dois en Java:

Toolkit.getDefaultToolkit().getScreenSize(); 

Répondre

4

J'ai quelque chose à travailler dans XP. Il ne prend actuellement en compte que la barre des tâches, donc il ne fera probablement pas la bonne chose dans Vista lorsque la barre latérale est visible. Cependant, cela fonctionne quel que soit l'emplacement de la barre d'outils.

Voici les méthodes que je crée avec une méthode simple de ResizeAndCenter qui montre leur utilisation:

; 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

Ces fonctions sont très utiles. Je les ai juste utilisés sous Windows 7 et ils fonctionnent magnifiquement. Merci. À votre santé! –

Questions connexes