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

  1. Это не работает, когда развернуто, ни когда окно смещено в одну сторону
  2. Граница даже не

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

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

#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

1 ответ1

1

Я бы порекомендовал переименовать переменные, чтобы иметь смысл. Оператор 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 мс, который постоянно обновляется. В этом случае он будет обновляться только тогда, когда окно перемещается, и таймер приходит с видимой задержкой и накладными расходами обработки. Но таймер является гораздо более простым решением для реализации вне шлюза (как вы уже сделали), и во многих случаях не стоит дополнительной сложности перехватывать события окна, если вам это не нужно. Просто сообщаю, что это возможно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .