![Ajuste esta borda vermelha ao redor do script AHK da janela ativa](https://rvso.com/image/1525455/Ajuste%20esta%20borda%20vermelha%20ao%20redor%20do%20script%20AHK%20da%20janela%20ativa.png)
Sou um novato em autohotkey, mas descobri esse tipo de script útil para colocar uma borda vermelha ao redor da minha janela ativa, tornando-a mais perceptível. Instalei o autohotkey e executei o script, mas tenho dois problemas:
- Não funciona quando maximizado nem quando a janela está virada para um lado
- A fronteira não é uniforme
Anexei algumas fotos mostrando o problema:
Se alguém pudesse ajudar e corrigir este script ou fornecer instruções detalhadas sobre como corrigi-lo (lembre-se de que sou um novato), ficaria grato.
#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
Responder1
Eu recomendaria renomear as variáveis para fazer sentido. A WinSet
instrução desenha duas caixas em pares de coordenadas x/y, portanto nomear as variáveis em pares de coordenadas x/y e atribuí-las antes da WinSet
instrução é menos confuso
Neste exemplo específico você também está desenhando a borda ao redor da parte externa da janela. Quando a parte externa da janela está na borda da tela, a borda fica fora da tela, portanto não ficará visível. Se você quiser desenhá-lo na tela quando a borda estiver na (ou mesmo fora) da borda da tela, você precisará desenhar a borda dentro (ou parcialmente dentro) do limite da janela em vez de desenhá-la fora do limite da janela .
Essa é apenas uma solução parcial porque, em um estado maximizado, a janela fica ainda mais fora da tela do que apenas nas bordas. Nesse caso, você deve detectar uma condição maximizada e deslocar a borda ainda mais do que normalmente seria em um certo número de pixels.
Alterei o nome das variáveis e ajustei seu código para dar um exemplo. Você pode alterar os diferentes 'tipos de borda' para ver os efeitos... o resto é apenas matemática se você quiser desenhá-lo de forma 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
Além disso, apenas para informação, também existem maneiras de conectar os eventos de retorno de chamada do Windows para eventos de movimentação de janela, para que você não precise usar um temporizador de 50 ms que está sempre atualizando. Nesse caso, ele só seria atualizado quando a janela se movesse e o cronômetro apresentasse atraso visível e sobrecarga de processamento. Mas o cronômetro é de longe a solução mais fácil de implementar desde o início (como você já fez) e, em muitos casos, não vale a pena a complexidade extra para conectar os eventos da janela se não for necessário. Apenas informando que isso é possível.
Responder2
Em vez de corrigir seu script, pegue esse código que faz exatamente o que você deseja.
#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
}
}