1

Тема: AHK: Скрипт вкл/выкл режим always on top для любого окна - помогите

Помогите разобраться, где ошибка.
Хочу реализовать через массив и заодно разобраться, как он работает.
По хоткею включается Always on top и в левом верхнем углу должен
выводиться gui, мол, такое-то окно в режиме Always on top.

^SPACE::

MouseGetPos, , , id_top,    ;узнаю id окна под курсором мыши, записываю в id_top    
Array := Object()        ;создаю массив Array         

Loop {

Value := Array%A_Index%     ;проверяю, есть ли id_top в массиве

if (Value := id_top)         ;если есть, значит включен режим Always on top  
    {
    MsgBox, v- %value%`ni - %A_index%`nid - %id_top%`nold
    RemovedValue := Array.Remove(%id_top%)
    Return
    }
}

Array%ArrayCount% := id_top
MsgBox, v- %value%`ni - %A_index%`nid - %id_top%`nNew

Return

Где-то ошибка, потому что условие if всегда верно, т.е. id_top уже есть в массиве,
хотя её туда ни кто не записывал.

2

Re: AHK: Скрипт вкл/выкл режим always on top для любого окна - помогите

^SPACE::

MouseGetPos, , , id_top,    ;узнаю id окна под курсором мыши, записываю в id_top    
Array := Object()        ;создаю массив Array         

Loop {  ; начало теоретически бесконечного цикла

Value := Array%A_Index%     ; записываете в переменную value значение переменной Array1, Array2 …

if (Value := id_top)         ; записываете в переменную value значение переменной id_top и в случае если переменная id_top не была пуста выполняеье блок ниже
    {
    MsgBox, v- %value%`ni - %A_index%`nid - %id_top%`nold
    RemovedValue := Array.Remove(%id_top%)
    return  ; выход из бесконечного цикла (при первом же выполнении)
    }
}

Array%ArrayCount% := id_top ; записываете в переменную Array значение переменной id_top
MsgBox, v- %value%`ni - %A_index%`nid - %id_top%`nNew

Return

Ошибка — везде. Продолжайте чтение раздела справки про массивы, «Pseudo-Arrays» — не массивы.

3

Re: AHK: Скрипт вкл/выкл режим always on top для любого окна - помогите

Гм, я пока не разобрался, где массив, а где псевдо, но вот рабочий скрипт:

Array := Array()         
ArrayCount := 0

^SPACE::

MouseGetPos, , , id_top,    

loop, %ArrayCount%
{
Value := Array[A_index] 
MsgBox, v- %value%`nid - %id_top%`nLopp
if (Value = id_top)
    {
    MsgBox, v- %value%`nAC - %ArrayCount%`nid - %id_top%`nold
    RemovedValue := Array.Remove(A_index)
    ArrayCount -= 1
    Return
    }
}

ArrayCount += 1
Array[ArrayCount] := id_top
MsgBox, id - %id_top%`n AC - %ArrayCount%`nNew

Return

4

Re: AHK: Скрипт вкл/выкл режим always on top для любого окна - помогите

По поводу «Скрипт вкл/выкл режим always on top»:

^Space::
    MouseGetPos,,, hWnd
    WinSet, AlwaysOnTop, Toggle, ahk_id %hWnd%
    return

5

Re: AHK: Скрипт вкл/выкл режим always on top для любого окна - помогите

Такой вариант возможен, конечно
Поясню, зачем мне нужен был массив - ниже пример скрипта, включающего режим  Always On Top
активного окна и добавляющего в заголовок окна надпись Always on top "ON". Если хоткейнуть уже On Top окно,
скрипт выключает режим и убирает из заголовка надпись. На мой взгляд полезно знать, что такое
"странное" творится с этим дурацким окном Но есть пара вопросов, требующих доработки.
Надпись не хочет добавляться в explorer в win 7 и не понятно как быть с броузером, ведь у него
я вообще отключил titlebar.

В общем, надеюсь кому понравится:

Array := Array()
ArrayTitle := Array()        
ArrayCount := 0

^SPACE::

WinGet, ontop, ID, A    
WinGetTitle, Title, ahk_id %ontop%
loop, %ArrayCount%
{
Value := Array[A_index]
if (Value = ontop)
    {
    OldTitle := ArrayTitle[A_index]
    WinSet, AlwaysOnTop, Off, ahk_id %ontop%
    WinSetTitle, ahk_id %ontop%, , %OldTitle%
    RemovedValue := Array.Remove(A_index)
    RemovedValue := ArrayTitle.Remove(A_index)
    ArrayCount -= 1
    Return
    }
}

ArrayCount += 1
Array[ArrayCount] := ontop
ArrayTitle[ArrayCount] := Title
WinSet, AlwaysOnTop, On, ahk_id %ontop%
WinSetTitle, ahk_id %ontop%, , %Title% - Always on top "ON"

Return