![Ajuste este borde rojo alrededor del script AHK de la ventana activa](https://rvso.com/image/1525455/Ajuste%20este%20borde%20rojo%20alrededor%20del%20script%20AHK%20de%20la%20ventana%20activa.png)
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:
- No funciona cuando está maximizada ni cuando la ventana se ajusta hacia un lado
- La frontera no es pareja
Adjunto algunas fotos que muestran el problema:
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 WinSet
declaració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 WinSet
declaració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
}
}