1

Тема: AHK: Получать сообщение о активации контрола GUI

Господа, каким образом можно поставить хук на событие активации \ деактивации элемента управления (например Edit) своего GUI?

Gui, Add, Edit, vEdit1 x10 w300 Center ReadOnly
Gui, Add, Edit, vEdit2 x10 w300 Center ReadOnly
Gui, Show
Return
            *******
MsgBox Контрол Edit1 деактивирован
            *******
MsgBox Активирован контрол Edit1
            *******

В данном случае поставил курсор ввода в Edit1, получил одно сообщение.
Убрал курсор ввода, ещё одно сообщение.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Получать сообщение о активации контрола GUI

Отслеживать с помощью OnMessage уведомление EN_SETFOCUS.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Получать сообщение о активации контрола GUI

Спасибо  за ответ. Но ничего как всегда мне с winaрi  не понятно.
Можно на примере, пожалуйста .

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Получать сообщение о активации контрола GUI

Там winaрi не нужно. Используется родная OnMessage. Я только попозже смогу написать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Получать сообщение о активации контрола GUI

Я только попозже смогу написать

Спасибо. Жду с нетерпением.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Получать сообщение о активации контрола GUI

global EN_SETFOCUS := 0x100, EN_KILLFOCUS := 0x200, hEdit1

Gui, Add, Edit, x10 w100 h23 hwndhEdit1
Gui, Add, Button, x50 w60, OK
Gui, Show, w120

OnMessage(0x111, "WM_COMMAND")
return

GuiClose:
    ExitApp

WM_COMMAND(wp, lp)
{
    if !(lp = hEdit1)
        return
    
    if (wp >> 16 = EN_SETFOCUS)
        ToolTip Контрол Edit1 получил фокус   ; здесь вместо ToolTip необходимые действия
                                              ; если действия занимают много времени, то лучше по таймеру
    if (wp >> 16 = EN_KILLFOCUS)
        ToolTip Контрол Edit1 потерял фокус   ; здесь вместо ToolTip необходимые действия
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: serzh82saratov, 2013-02-25 21:09:56)

Re: AHK: Получать сообщение о активации контрола GUI

teadrinker спасибо вам большое в который раз!

Если вам не сложно, просвятите меня по счёт OnMessage. 0x111 в строке с OnMessage
это WM_COMMAND из этого списка тут же в строке WM_COMMAND - имя функции (может быть любое) которая будет получать сообщения от WM_COMMAND. Вторым параметром она возвращает hwnd контрола, а первым непонятно. EN_SETFOCUS := 0x100, EN_KILLFOCUS := 0x200 заданы как псевдонимы, то есть их значения можно использовать напрямую в выражениях функции. Непонятно, откуда взялись 0x100 и 0x200. (wp >> 16 = EN_SETFOCUS) что значит это выражение.  И как это всё искать на msdn я так и непонял, где указано что должна возвращать WM_COMMAND в параметрах wp и lp.

И зачем тогда в этом списке
WM_SETFOCUS = 0x07
WM_KILLFOCUS = 0x08

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Получать сообщение о активации контрола GUI

serzh82saratov пишет:

Вторым параметром она возвращает hwnd контрола, а первым непонятно.

В первом параметре возвращаются два значения. В старшем слове (вторые от начала 2 байта) — код оповещения (их может быть много, но мы отслеживаем только EN_SETFOCUS и EN_KILLFOCUS), в младшем слове (первые от начала 2 байта) — идентификатор контрола (не путать с hwnd). Нас интересует старшее слово. Чтобы получить эту часть параметра, осуществляем поразрядный сдвиг вправо, затем сравниваем полученный результат со значениями EN_SETFOCUS и EN_KILLFOCUS (чему они равны, можно узнать из Гугла, если найти таблицы констант Windows или какой-нибудь код, где их значения указаны).

И как это всё искать на msdn я так и непонял, где указано что должна возвращать WM_COMMAND в параметрах wp и lp.

В разделе Remarks.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Получать сообщение о активации контрола GUI

Спасибо. Буду "курить".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Получать сообщение о активации контрола GUI

Скажите, а есть какой-то простой способ (без использования асс. массивов), определять именно имя переменной hwnd контрола:

Gui, Add, Edit, h23 w100 hwndhEdit1
Gui, Add, Edit, h23 w100 hwndhEdit2 
Gui, Show, w140
OnMessage(0x111, "WM_COMMAND")
return

WM_COMMAND(wp, lp)
{
    Global hEdit1, hEdit2
    Static EN_SETFOCUS := 0x100, EN_KILLFOCUS := 0x200

    if !(lp = hEdit1 || lp = hEdit2)
        return
    
    if (wp >> 16 = EN_SETFOCUS)
        ToolTip % Имя переменной hwnd контрола
    .........

}

GuiClose:
    ExitApp

тут при каждой активации контролов хочется видеть в сообщении "hEdit1" или "hEdit2".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Получать сообщение о активации контрола GUI

Странный вопрос. Эта строчка что делает if !(lp = hEdit1 || lp = hEdit2)?

12

Re: AHK: Получать сообщение о активации контрола GUI

Плохо сформулировал суть.
Если функция WM_COMMAND будет лежать например в библиотеке, а ей при старте скрипта будут "скармливатся" списком неизвестные нам ни по количеству, ни по названию переменные содержащие hwnd за которыми она будет следить. Сравнение идёт между числами, и когда будет совпадение с какой-то из переменных, как узнать именно её имя?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Получать сообщение о активации контрола GUI

serzh82saratov пишет:

Плохо сформулировал суть.
Если функция WM_COMMAND будет лежать например в библиотеке, а ей при старте скрипта будут "скармливатся" списком неизвестные нам ни по количеству, ни по названию переменные содержащие hwnd за которыми она будет следить. Сравнение идёт между числами, и когда будет совпадение с какой-то из переменных, как узнать именно её имя?

Никак, придётся имена тоже передавать в библиотеку.

14 (изменено: serzh82saratov, 2013-03-07 03:06:17)

Re: AHK: Получать сообщение о активации контрола GUI

Александр_  пишет:

Никак, придётся имена тоже передавать в библиотеку.

Поэтому принципу думаю получится:


Gui, Add, Edit, hwndПервый
Gui, Add, Edit, hwndВторой 
Gui, Add, Edit, hwndТретий
HF_GetControl( "Первый|Второй|Третий")
return
HF_GetControl(Control)
{
    Loop, Parse, Control, | 
        HF_Control%A_Index% := %A_LoopField% , NHF_Control%A_Index% := A_LoopField , HF_MaxIndex := A_Index , MsgBox .= NHF_Control%A_Index% . "  =  " . HF_Control%A_Index% . "`r" 
    MsgBox % MsgBox . "`rМассив создан из " . HF_MaxIndex . " контролов"
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: Александр_, 2013-03-07 04:01:53)

Re: AHK: Получать сообщение о активации контрола GUI

Значения хендлов тоже нужно сохранить.