Тонкая настройка Красной рамки вокруг активного окна AHK скрипта

Я новичок в autohotkey, но я нашел этот полезный скрипт для размещения красной границы вокруг моего активного окна, что делает его более заметным. Я установил autohotkey и запустить скрипт, однако у меня есть две проблемы:

  1. это не работает, когда развернуто, ни когда окно привязано к одной стороне
  2. граница даже не

Я приложил несколько фотографий, показывающих проблему:picutre showing problems

Если кто-то мог бы помочь и исправить этот сценарий, или предоставить подробные инструкции о том, как это исправить (пожалуйста, имейте в виду, я новичок) я был бы благодарен.

#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
22
задан John
18.12.2022 15:43 Количество просмотров материала 3262
Распечатать страницу

1 ответ

Я бы рекомендовал переименовать переменные, чтобы иметь смысл. The WinSet оператор рисует два поля в парах координат x / y, так называя переменные в парах координат x/y и присваивая их до WinSet утверждение менее запутанной

в этом конкретном примере вы также рисуете границу вокруг внешней стороны окна. Когда за окном, на краю экрана, граница с экрана, поэтому его не будет видно. Если вы хотите нарисовать его на экране, когда граница находится на краю экрана (или даже вне его), вам нужно будет нарисовать границу внутри (или частично внутри) границы окна или нарисовать ее за пределами границы окна.

Это только частичное решение, поскольку в развернутом состоянии, окно еще дальше от экрана, чем просто быть на краю(с). В этом случае необходимо обнаружить развернутое условие и сдвинуть границу еще дальше, чем обычно, на определенное число пикселы.

Я изменил переименовал переменные и изменил ваш код, чтобы привести пример. Вы можете изменить другой "тип границы", чтобы увидеть эффекты... остальное просто математика, если вы хотите сделать это по-другому.

#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

кроме того, только для информации, есть также способы подключить события обратного вызова windows для событий перемещения окна, так что вам не придется использовать таймер 50мс, который всегда обновляется. В этом случае он будет обновляться только тогда, когда Окно движется, и таймер поставляется с видимые задержки и накладные расходы на обработку. Но таймер-это более простое решение, безусловно, для реализации вне ворот (как вы это уже сделали), и во многих случаях на самом деле не стоит дополнительной сложности, чтобы зацепить события окна, Если вам это не нужно. Просто даю тебе знать, что это возможно.

0
отвечен JJohnston2 2022-12-19 23:31

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх