1 (изменено: mixaenpcm, 2015-08-29 01:50:27)

Тема: AHK: GuiControl не обновляет контрол по горячей клавише

Здравствуйте.
С пол-года бьюсь над проблемой и как-то нигде не могу найти ответ на вопрос, почему GuiControl не обновляет значение контрола по горячей клавише,  прекрасно работая по кнопке на форме, в цикле и т.п.


Gui, New
Gui, Add, Text, y7 w200 h16 vStateMsg,Qwerty
Gui, Add, Button, y5 w38 h16, Btn
Gui, Add, Button, y5 w38 h16, Cycle
Gui, Show
Return

GuiClose:
    ExitApp
ButtonBtn:
    GuiControl,,StateMsg,Gui button is pressed
return
ButtonCycle:
    Loop, 5
    {
        GuiControl,,StateMsg,%A_index%
        Sleep, 1000
    }
return
^!+F1::
    GuiControl,,StateMsg,Hotkey is pressed
MsgBox Hotkey is pressed
return

Проверял в разных версиях AHK, на разных машинах, на разных осях (XP, 7).

2

Re: AHK: GuiControl не обновляет контрол по горячей клавише

А с какой целью вы используете команду

Gui, New

?

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

3

Re: AHK: GuiControl не обновляет контрол по горячей клавише

Если убрать

Gui, New

, то всё должно работать.

4

Re: AHK: GuiControl не обновляет контрол по горячей клавише

MoZg пишет:

Если убрать

Gui, New

, то всё должно работать.

И действительно работает!
Спасибы огромные!
Нутром чуял, что дело в деталях, но не знал, в каких. А деталь оказалась в стороне от моего понятия устройсва мира (в частности, оператора Gui, New) и в очередной раз перетрясла относительно стройную картинку.
И хотя задача решена, прошу объяснить смысл Gui, New.
Потому что в моем понимании это - команда явного создания нового окна, в отличии от неявного создания при первом появлении команды Gui, Add.
Разве не так?

P.S. К сожалению, в английском не настолько силен, чтобы полностью понимать статьи в оригинале.

5

Re: AHK: GuiControl не обновляет контрол по горячей клавише

В этом случае создаст второе окно и работа с ним будет по умолчанию.

Gui add,text,,Окно1, надпись 1
Gui show, w200 h200

Gui new
Gui add,text,,Окно2, надпись 1
Gui show, w200 h200 x400

А в этом, скрипт добавит надпись в первое окно и обновит его.

Gui add,text,,Окно1, надпись 1
Gui show, w200 h200

Gui add,text,,Окно1, надпись 2
Gui show, w200 h200 x400

6 (изменено: mixaenpcm, 2015-08-29 17:49:05)

Re: AHK: GuiControl не обновляет контрол по горячей клавише

yalanne пишет:

В этом случае создаст второе окно и работа с ним будет по умолчанию...

Но этот пример не противоречит моему миропониманию и не объясняет причину неработоспособности в моем случае, ибо в моем коде создается новое окно и принимается в качестве "умолчального". Когда же я жму горячую клавишу, то и вывод идет в умолчальное окно, созданное последним. А вот этого-то и не происходит.
В чем мое недопонимание?

7 (изменено: Indomito, 2015-08-29 19:43:22)

Re: AHK: GuiControl не обновляет контрол по горячей клавише

Думаю HWND меняется, но это предположение, я проверял минут 5 - простой подход не подходит, т.е. у меня не получилось.

Куски из скрипта - рабочего, весь не привожу, в нём "чёрт ногу сломит".

;Создать
Gui, Add, Text, HWNDhText Hidden, %ovTxt%
;Показать
GuiControl, Show, %hText%
;Удалить
GuiControl, Delete, %hText%  ; А лучше GuiControl, Disable, %hText%

Это работает, думаю та же проблема и с окном у тебя.

P.S. Я попытался по алгоритму выше менять имя кнопки(не подпрограммы реакции), имя откатывается на первоначальное.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8

Re: AHK: GuiControl не обновляет контрол по горячей клавише

Команда GuiControl в виде

GuiControl,,StateMsg,%A_index%

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

Для веток, не созданных окнами, в том числе созданных горячими клавишами, окном по умолчанию является окно с номером 1. Команда же Gui, New создаёт окно без имени и без номера, поэтому GuiControl в данном случае не срабатывает.

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

9 (изменено: mixaenpcm, 2015-08-30 12:54:40)

Re: AHK: GuiControl не обновляет контрол по горячей клавише

Мысль teadrinker-а звучит достаточно убедительно.
У Indomito этот подход работает и хорошо вписывается в описание teadrinker-а. Только Indomito думает, что Hwnd контрола меняется.
В моем примере достаточно вместо имени контрола в GuiControl поставить Hwnd, как все прекрасно начинает работать и вместе с Gui, New.


Gui, New
...
Gui, Add, Text, y7 w200 h16 vStateMsg HwndStateMsgHwnd,Qwerty
...
GuiControl,,%StateMsgHwnd%,Hotkey is pressed

Хотя в моем случае Gui, New действительно был лишним.
...Да, а самая главная причина ошибки - в невесть откуда взявшемся предположении, что AHK-скрипт, не использующий GUI в явном виде, вообще не создает GUI.
В этом случае Gui, New выглядел логичным созданием (единственного) окна. А на самом деле он создавал второй экземпляр GUI со всеми вытекающими последствиями.
Что-ж, всем спасибо за науку!

10 (изменено: Indomito, 2015-08-30 23:08:32)

Re: AHK: GuiControl не обновляет контрол по горячей клавише

mixaenpcm пишет:

Только Indomito думает, что Hwnd контрола меняется.

Нет, я знаю что не меняется, извиняюсь за неудачный пример.
У меня много окон и много контролов, вот и пришлось оформить это как переменную, что бы оформить как одну подпрограмму.

Ещё раз извиняюсь.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro