Ajuste esta borda vermelha ao redor do script AHK da janela ativa

Ajuste esta borda vermelha ao redor do script AHK da janela ativa

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:

  1. Não funciona quando maximizado nem quando a janela está virada para um lado
  2. A fronteira não é uniforme

Anexei algumas fotos mostrando o problema:picutre mostrando problemas

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 WinSetinstruçã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 WinSetinstruçã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
  }
}

informação relacionada