2009-06-05 14 views
5

Estoy intentando escribir algunas secuencias de comandos de AutoHotkey para mover ventanas, y tengo problemas para obtener los valores de tamaño de pantalla correctos.Obtener área de pantalla disponible en autohotkey

Estoy tratando de obtener el tamaño del área utilizable en la pantalla (generalmente la resolución de pantalla completa menos la barra de tareas, y tal vez cualquier otra ventana acoplada como la barra lateral en Vista). Ninguno de los métodos que he encontrado para obtener el ancho de la pantalla parece funcionar.

Ninguno de los 3 métodos que encontré para obtener el tamaño de pantalla me da los valores correctos. Aquí está la escritura de la prueba que estoy usando (que funciona en XP con la barra de tareas en la parte inferior con el tamaño predeterminado):

#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 hace que la ventana para ocupar toda la resolución, por lo que se superpone a la barra de tareas.

# 8 hace que el ancho sea mayor que la resolución (veo el borde derecho de la ventana en mi monitor secundario) y la altura es demasiado grande, por lo que la ventana se solapa parcialmente con el área de la barra de tareas. Parece que esto es correcto, excepto por no tener en cuenta las decoraciones de las ventanas en los bordes.

# 9 parece tener el ancho correcto, pero la altura es demasiado corta. Parece que resta la altura de la barra de tareas desde la altura de la resolución, pero luego resta otros 30 píxeles de ella.

Podría simplemente usar lo que tengo en el n. ° 9 y sumar 30 a la altura que obtengo, pero se siente como un truco que se rompería en otras configuraciones. Parece que tiene que haber una forma de obtener el tamaño de pantalla disponible correctamente, pero no puedo encontrarlo en AutoHotkey.

Como referencia, esto parece dame lo que necesito en Java:

Toolkit.getDefaultToolkit().getScreenSize(); 

Respuesta

4

que tienes algo de trabajo en XP. Actualmente, solo tiene en cuenta la barra de tareas, por lo que probablemente no haga lo correcto en Vista cuando la barra lateral esté visible. Sin embargo, funciona independientemente de dónde esté la barra de herramientas.

Estos son los métodos que he creado, junto con un simple método ResizeAndCenter que muestra su 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

Estas funciones son muy útiles. Solo los usé en Windows 7 y funcionan muy bien. Gracias. ¡Aclamaciones! –

Cuestiones relacionadas