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

0

Eu sou um novato no autohotkey, mas eu encontrei este tipo de script útil para colocar uma borda vermelha em torno da minha janela ativa, tornando-a mais perceptível. Eu instalei o autohotkey e executei o script, no entanto, tenho dois problemas:

  1. Ele não funciona quando maximizado nem quando a janela é encaixada em um lado
  2. A borda não é igual a

Anexei algumas fotos mostrando o problema:

Se alguém puder, por favor, ajude & corrija este script, ou forneça instruções detalhadas de como corrigi-lo (por favor, tenha em mente que eu sou um novato) Eu 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
    
por John 21.03.2017 / 03:51

1 resposta

0

Eu recomendaria renomear as variáveis para fazer sentido. A instrução WinSet 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 instrução WinSet é 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 está fora da tela, por isso não será visível. Se você quiser desenhá-lo na tela quando a borda estiver na borda da tela (ou mesmo dela), será necessário desenhar a borda interna (ou parcialmente interna) no limite da janela vs. desenhá-la fora do limite da janela .

Isso é apenas uma solução parcial, porque, em um estado maximizado, a janela fica ainda mais longe da tela do que apenas estar na (s) borda (s). Nesse caso, você precisa detectar uma condição maximizada e compensar a borda ainda mais do que seria normalmente por um determinado número de pixels.

Eu ajustei o nome para as variáveis e ajustei seu código para dar um exemplo. Você pode alterar o 'tipo de borda' diferente para ver os efeitos ... o resto é apenas matemática se você quiser desenhar 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, 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%
 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ções, também há maneiras de ligar os eventos de retorno de chamada do Windows para eventos de movimentação de janelas, para que você não precise usar um cronômetro de 50ms que esteja sempre atualizando. Nesse caso, ele só será atualizado quando a janela se mover e o cronômetro chegar com atraso visível e sobrecarga de processamento. Mas o temporizador é de longe a solução mais fácil de implementar do lado de fora (como você já fez), e em muitos casos não vale a complexidade extra para ligar os eventos da janela se você não precisa. Só permitindo que você saiba que isso é possível.

    
por 22.03.2017 / 06:19