1 (изменено: Валк, 2011-10-17 21:08:01)

Тема: AutoHotKey: Активация только определённых окон под курсором

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

Написал скрипт, по мотивам этого форума (ahk_class окон моего рабочего приложения - SunAwtFrame):

~LButton:: SetTimer, Activation, Off
LButton Up:: SetTimer, Activation, On

Activation:
    MouseGetPos,,, Win_ID
    IF(ahk_class %Win_ID% = SunAwtFrame)
    {
        If(Win_ID != Prev_Win_ID)
        {
            Prev_Win_ID := Win_ID
            WinActivate, ahk_id %Win_ID%
        }
    }
Return

да только почему-то не работает он и даже если нажать кнопку мышки предварительно притопив Shift, то скрипт на паузу не встаёт.

Помогите, пожалуйта.

2

Re: AutoHotKey: Активация только определённых окон под курсором

Для начала опишите, как это должно работать. Затем, как это работает на деле.

P. S. А зачем вешать таймер на кнопку мыши? Чтобы следить за окном под курсором, горячие клавиши не требуются.

3

Re: AutoHotKey: Активация только определённых окон под курсором

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

IF(ahk_class %Win_ID% = SunAwtFrame)

не работает.

А на мышку я повесил таймер (включение/отключение), чтобы была возможность отключить этот таймер, аналогично пункту Pause Script в контекстном меню АНК в трее.

4

Re: AutoHotKey: Активация только определённых окон под курсором

Судя по всему, командой MouseGetPos Вы определяете идентификатор окна (HWND), а не класс ahk_class. А он у каждого окна свой (и вроде меняется при перезапуске приложения).

5

Re: AutoHotKey: Активация только определённых окон под курсором

Тогда бы по идее, у меня не должны отрабатывать строки:

        If(Win_ID != Prev_Win_ID)
        {
            Prev_Win_ID := Win_ID
            WinActivate, ahk_id %Win_ID%
        }

Ведь они же должны отрабатываться если ahk_class %Win_ID% = SunAwtFrame.

P. S. А какой командой определяется ahk_class? (у окон моего приложения он всегда SunAwtFrame)

6

Re: AutoHotKey: Активация только определённых окон под курсором

WinGetClass.

7

Re: AutoHotKey: Активация только определённых окон под курсором

ypppu
Не сочти за дерзость, скажи, пожалуйста, как написать код, чтобы если у окна под мышкой ahk_class = SunAwtFrame, то это окно становилось активным, если любой другой класс, то ничего не делалось чтобы.

И как прикрутить, чтобы эту проверку можно было отключить, поставить на паузу, каким-нибудь сочетанием кнопок.

8

Re: AutoHotKey: Активация только определённых окон под курсором

Loop
{
Sleep, 100
MouseGetPos,,, Win_ID
WinGetClass, WinClass, ahk_id %Win_ID%
IF WinClass = Notepad
WinActivate, ahk_id %Win_ID%
}

Вот, тренируйтесь на кошках. То бишь на Блокноте.

А как поставить скрипт на паузу - описано в документации.

9 (изменено: Валк, 2011-10-20 23:50:09)

Re: AutoHotKey: Активация только определённых окон под курсором

ypppu
Спасибо за код, всё заработало (только я через SetTimer сделал).