Ajuste este borde rojo alrededor del script AHK de la ventana activa

Ajuste este borde rojo alrededor del script AHK de la ventana activa

Soy un novato en autohotkey, pero encontré este tipo de script útil para poner un borde rojo alrededor de mi ventana activa para hacerla más visible. Instalé autohotkey y ejecuté el script, sin embargo, tengo dos problemas:

  1. No funciona cuando está maximizada ni cuando la ventana se ajusta hacia un lado
  2. La frontera no es pareja

Adjunto algunas fotos que muestran el problema:imagen que muestra problemas

Si alguien pudiera ayudar y arreglar este script, o proporcionar instrucciones detalladas sobre cómo solucionarlo (tenga en cuenta que soy un novato), se lo agradecería.

#Persistent

SetTimer, DrawRect, 50
border_thickness = 10
border_color = FF0000

DrawRect:
WinGetPos, x, y, w, h, A
if (x="")
    return
Gui, +Lastfound +AlwaysOnTop +Toolwindow
iw:= w+4
ih:= h + 4
w:=w+ 8
h:=h + 8
x:= x - border_thickness
y:= y - border_thickness
Gui, Color, FF0000
Gui, -Caption
WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% 0-0 %border_thickness%-%border_thickness% %iw%-%border_thickness% %iw%-%ih% %border_thickness%-%ih% %border_thickness%-%border_thickness%
Gui, Show, w%w% h%h% x%x% y%y% NoActivate, Table awaiting Action
return

Respuesta1

Recomendaría cambiar el nombre de las variables para que tengan sentido. La WinSetdeclaración dibuja dos cuadros en pares de coordenadas x/y, por lo que nombrar las variables en pares de coordenadas x/y y asignarlas antes de la WinSetdeclaración es menos confuso.

En este ejemplo particular, también estás dibujando el borde alrededor del exterior de la ventana. Cuando el exterior de la ventana está en el borde de la pantalla, el borde está fuera de la pantalla, por lo que no será visible. Si desea dibujarlo en la pantalla cuando el borde está en (o incluso fuera de) el borde de la pantalla, deberá dibujar el borde dentro (o parcialmente dentro) del límite de la ventana en lugar de dibujarlo fuera del límite de la ventana. .

Sin embargo, esa es solo una solución parcial porque en un estado maximizado, la ventana está incluso más lejos de la pantalla que simplemente en los bordes. En ese caso, debe detectar una condición maximizada y desplazar el borde aún más de lo normal en una cierta cantidad de píxeles.

Modifiqué el nombre de las variables y modifiqué su código para dar un ejemplo. Puedes cambiar los diferentes 'tipos de borde' para ver los efectos... el resto es sólo matemática si quieres dibujarlo de manera diferente.

#Persistent

SetTimer, DrawRect, 50
border_thickness = 5
border_color = FF0000

DrawRect:
WinGetPos, x, y, w, h, A
if (x="")
    return
Gui, +Lastfound +AlwaysOnTop +Toolwindow

borderType:="inside"                ; set to inside, outside, or both

if (borderType="outside") { 
    outerX:=0
    outerY:=0
    outerX2:=w+2*border_thickness
    outerY2:=h+2*border_thickness

    innerX:=border_thickness
    innerY:=border_thickness
    innerX2:=border_thickness+w
    innerY2:=border_thickness+h

    newX:=x-border_thickness
    newY:=y-border_thickness
    newW:=w+2*border_thickness
    newH:=h+2*border_thickness

} else if (borderType="inside") {   
    WinGet, myState, MinMax, A
    if (myState=1)
        offset:=8
    else 
        offset:=0

    outerX:=offset
    outerY:=offset
    outerX2:=w-offset
    outerY2:=h-offset

    innerX:=border_thickness+offset
    innerY:=border_thickness+offset
    innerX2:=w-border_thickness-offset
    innerY2:=h-border_thickness-offset

    newX:=x
    newY:=y
    newW:=w
    newH:=h



} else if (borderType="both") { 
    outerX:=0
    outerY:=0
    outerX2:=w+2*border_thickness
    outerY2:=h+2*border_thickness

    innerX:=border_thickness*2
    innerY:=border_thickness*2
    innerX2:=w
    innerY2:=h

    newX:=x-border_thickness
    newY:=y-border_thickness
    newW:=w+4*border_thickness
    newH:=h+4*border_thickness
}



Gui, Color, %border_color%
Gui, -Caption

;WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% 0-0 %border_thickness%-%border_thickness% %iw%-%border_thickness% %iw%-%ih% %border_thickness%-%ih% %border_thickness%-%border_thickness%
 WinSet, Region, %outerX%-%outerY% %outerX2%-%outerY% %outerX2%-%outerY2% %outerX%-%outerY2% %outerX%-%outerY%    %innerX%-%innerY% %innerX2%-%innerY% %innerX2%-%innerY2% %innerX%-%innerY2% %innerX%-%innerY% 


;Gui, Show, w%w% h%h% x%x% y%y% NoActivate, Table awaiting Action
Gui, Show, w%newW% h%newH% x%newX% y%newY% NoActivate, Table awaiting Action
return

Además, solo para obtener información, también hay formas de conectar los eventos de devolución de llamada de Windows para eventos de movimiento de ventana para que no tenga que usar un temporizador de 50 ms que siempre se actualiza. En ese caso, solo se actualizará cuando la ventana se mueva, y el temporizador viene con un retraso visible y una sobrecarga de procesamiento. Pero el temporizador es, con diferencia, la solución más fácil de implementar desde el principio (como ya lo ha hecho), y en muchos casos no vale la pena la complejidad adicional de conectar los eventos de ventana si no es necesario. Sin embargo, solo te hago saber que es posible.

Respuesta2

En lugar de corregir su script, tome este código que hace exactamente lo que desea.

#Requires AutoHotkey 2.0+
#SingleInstance Force
SetTimer(DrawBorder,100)

DrawBorder(){
  Static OS:=3
  Static BG:="FF0000"
  Static myGui:=Gui("+AlwaysOnTop +ToolWindow -Caption","GUI4Border")
  myGui.BackColor:=BG
  WA:=WinActive("A")
  If WA && !WinGetMinMax(WA) && !WinActive("GUI4Border ahk_class AutoHotkeyGUI"){
    WinGetPos(&wX,&wY,&wW,&wH,WA)
    myGui.Show("x" wX " y" wY " w" wW " h" wH " NA")
    Try WinSetRegion("0-0 " wW "-0 " wW "-" wH " 0-" wH " 0-0 " OS "-" OS " " wW-OS
    . "-" OS " " wW-OS "-" wH-OS " " OS "-" wH-OS " " OS "-" OS,"GUI4Border")
  }Else{
    myGui.Hide()
    Return
  }
}

información relacionada