1 (изменено: Malcev, 2012-12-17 08:58:35)

Тема: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Имеется код, который следит за появлением окна New Sequence и в зависимости как его закрыли делает действия.
Вопрос: почему если делать Sleep < 200 то в в A_PriorKey  не всегда записывается Escape. Хотя Mouse Button записывается вообще без Sleep.
И еще заметил зависимость удерживания esc, и увеличения sleep,
то есть, чем дольше задерживаешь, тем больше Sleep должен быть для распознавания.
Как это все объясняется и есть ли обходные пути?

#SingleInstance force
#InstallKeybdHook
#InstallMouseHook
Start:
loop
{
   IfWinActive, New Sequence
   {          
      loop
      {
         GetKeyState, state, LButton
         if state = D
            MouseGetPos, xpos, ypos
         IfWinNotExist, New Sequence
            break
      }
      sleep 500 ; если делать меньше, то в A_PriorKey  не всегда записывается Escape
      if (A_PriorKey = "Escape") || (A_PriorKey = "f4") || (A_PriorKey = "LButton") && (xpos > 590) || (A_PriorKey = "LButton") && (ypos < 60)
         Goto, Start
......
}

2

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Goto, Start

Эта строка равнозначна continue

есть ли обходные пути?

Пересмотреть концепцию скрипта

(Я как вижу Goto в Loop так сразу начинаю подозревать, что скрипт далёк от совершенства)

3 (изменено: Malcev, 2012-12-17 17:42:06)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Эта строка равнозначна continue

Точно!
Но затык-то не в этом, так-как клавиши не запоминаются до этой команды

Пересмотреть концепцию скрипта

А в какую сторону пересматривать-то?
Чисто гипотетически имеем окно без видимых контролов для кнопок, которое можно закрыть (отменить) с помощью esc, Alt+f4, или нажав на кнопку cancel или нажав на крестик.
http://www.morgan-multimedia.com/morgan/images/uploaded/ADBE_PP_Sequence_Presets.png
Перед закрытием нужно считать информацию, которая находится под Preset Description.
Поэтому он выглядит так

#SingleInstance force
#InstallKeybdHook
#InstallMouseHook
Start:
loop
{
   IfWinActive, New Sequence
   {          
      loop
      {
         GetKeyState, state, LButton
         if state = D
            MouseGetPos, xpos, ypos
         NameOld := Name
         ControlGetText, Name, Edit4, New Sequence
         IfWinNotExist, New Sequence
            break
      }
      sleep 500
      if (A_PriorKey = "Escape") || (A_PriorKey = "f4") || (A_PriorKey = "LButton") && (xpos > 590) || (A_PriorKey = "LButton") && (ypos < 60)
         Continue
      SplashImage,,  w120 B1  ,, Please Wait...
      If Name =
         Name := NameOld
      StringReplace, Name, Name, `r`n, `n, All
      Send, ^{vk5A}^{vk49} ; Crtl+z Ctrl+i 
.......

(Я как вижу Goto в Loop так сразу начинаю подозревать, что скрипт далёк от совершенства)

Согласен, только серым лучше не писать, так как еле с третьего раза разглядел

4

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

А в какую сторону пересматривать-то?

В строну отказа от A_PriorKey.

5 (изменено: Malcev, 2012-12-17 17:48:48)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

А лучший вариант можно озвучить?
А то я знаю только еще один.
http://www.autohotkey.com/docs/FAQ.htm#repeat

6 (изменено: creature.ws, 2012-12-17 19:15:56)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

которое можно закрыть (отменить) с помощью esc, Alt+f4, или нажав на кнопку cancel или нажав на крестик.

Сответственно «не отменять» его можно лишь нажатием Enter?

Правильнее отслеживать событие которое явно указывает на необходимость продолжать, ведь окно можно «убрать» иными способами, учёт которых не имеет смысла.

Пример:

winTitle := "ahk_class Notepad"
classNN := "Edit1"

loop {
    WinWaitActive, %winTitle%
    ControlGetText, Name, %classNN% , %winTitle%
    Input, singleKey, v l1, {Enter}
}
until ErrorLevel = "EndKey:Enter"

MsgBox мы дождались нажатия Enter в окне %winTitle%`nтекст в окне перед нажатием Enter:`n`n%Name%

7 (изменено: Malcev, 2012-12-17 19:30:27)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Да, с Input я тоже вначале пробовал.
Но  проблема в том, что «не отменять» его можно не только нажатием Enter,
но еще и нажатием мыши на ОК либо нажатием 2 раза мышью на любой из пресетов.

8 (изменено: creature.ws, 2012-12-17 19:47:53)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Input попробовали, но использовать решили A_priorKey, A_priorKey надежды не оправдал, но …
Что-то я не пойму ход ваших мыслей

9

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Попробуй вместо использования A_PriorKey менять флаг (Achtung ), повесив на Esc хоткей:

+ открыть спойлер
#SingleInstance force
#InstallKeybdHook
#InstallMouseHook
Start:
loop
{
   IfWinActive, New Sequence
   {          
      Achtung := 0
      loop
      {
         GetKeyState, state, LButton
         if state = D
            MouseGetPos, xpos, ypos
         NameOld := Name
         ControlGetText, Name, Edit4, New Sequence
         IfWinNotExist, New Sequence
            break
      }
      if Achtung || (A_PriorKey = "LButton") && (xpos > 590) || (A_PriorKey = "LButton") && (ypos < 60)
         Continue
      SplashImage,,  w120 B1  ,, Please Wait...
      If Name =
         Name := NameOld
      StringReplace, Name, Name, `r`n, `n, All
      Send, ^{vk5A}^{vk49} ; Crtl+z Ctrl+i 
.......


~Escape::
~!F4::
Achtung := 1
Return 

10

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Так команда Input же ждет пока не произойдет нажатие определенной клавиши.
А мне надо, чтобы цикл заканчивался не только по нажатию enter, но и по нажатию кнопки мышки.

11

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Что мешает ждать клавиши с помощью Input, а клики в нужных (или ненужных) координатах отлавливать иным способом?

12

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Irbis, с флагом тоже пробовал - результат такой же.
Мне кажется, что A_PriorKey что срабатывание хоткиев проходят по одному алгоритму.

Что мешает ждать клавиши с помощью Input, а клики в нужных (или ненужных) координатах отлавливать иным способом?

Ну вот с Input я так до конца и не разобрался, потому как цикл останавливается на этом инпуте и ждет нажатия кнопки.
А как ловить паралельно нажатия мыши?

13 (изменено: creature.ws, 2012-12-18 09:07:37)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки


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

winTitle := "New Sequence"
classNN := "Edit4"
KeyList := {winTitle: winTitle, Hotkeys: ["~Esc", "~!f4", "~LButton"]}
CloseButton := {x0: 123, x1: 234, y0: 345, y1: 567} ; координаты кнопки закрытия окна
CancelButton := {x0: 123, x1: 234, y0: 345, y1: 567} ; координаты кнопки отмены

loop
{
    WinWaitActive, %winTitle%
    SetHotkeys(KeyList, "WindowClose")
    WinWaitClose, %winTitle%
    SetHotkeys(KeyList, "")
}
until !windowClosed

MsgBox %winTitle%`nтекст :`n`n%text%
return

WindowClose:
    ControlGetText, text, %classNN% , %winTitle%
    windowClosed := (A_ThisHotkey ~= "LButton")? ClickInRect(CloseButton) || ClickInRect(CancelButton) : true
    return

SetHotkeys(KeyList, label) {
    if KeyList.winTitle
        Hotkey, IfWinActive, % KeyList.winTitle

    for index, key in KeyList.Hotkeys
        Hotkey, %key%, % label? label : "Off", % label? "On" : ""
}

ClickInRect(Rect) {
    CoordMode, Mouse, Relative
    MouseGetPos, x, y
    return x > Rect.x0 && x < Rect.x1 && y > Rect.y0 && y < Rect.y1
}

Непонятно — спрашивайте, прокомментирую.

14 (изменено: Malcev, 2012-12-18 20:13:06)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Если честно, то непонятно почти все.

KeyList := {winTitle: winTitle, Hotkeys: ["~Esc", "~!f4", "~LButton"]}

- это как такую конструкцию понять?

SetHotkeys(KeyList, "WindowClose")

- почему кавычки, что значит эта буквальная строка?   Типа GoSub?

SetHotkeys(KeyList, label) {
    if KeyList.winTitle
        Hotkey, IfWinActive, % KeyList.winTitle

    for index, key in KeyList.Hotkeys
        Hotkey, %key%, % label? label : "Off", % label? "On" : ""
}

вот это все непонятно.

Спасибо. Ну и замудренный скрипт у вас получился.

15 (изменено: creature.ws, 2012-12-18 21:37:12)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

это как такую конструкцию понять?

KeyList := {}
Это создание объекта с именем KeyList.
KeyList := {winTitle: …, Hotkeys: …}
Объект KeyList содержит два поля: winTitle и Hotkeys.
winTitle: winTitle
В поле с именем winTitle записано содержимое переменной winTitle
Hotkeys: ["~Esc", "~!f4", "~LButton"]
В поле с именем Hotkeys записан массив содержащий три значения:
под номером 1 — строку ~Esc
под номером 2 — строку ~!f4 и т.д.

почему кавычки

Второй аргумент — строка.

вот это все непонятно.

Это всё равнозначно:

Hotkey, IfWinActive, New Sequence
Hotkey, ~Esc, WindowClose , On
Hotkey, ~!f4, WindowClose, On
Hotkey, ~LButton, WindowClose, On

При SetHotkeys(KeyList, "WindowClose")

Hotkey, IfWinActive, New Sequence
Hotkey, ~Esc, Off
Hotkey, ~!f4, Off
Hotkey, ~LButton, Off

При SetHotkeys(KeyList, "")

Ну и замудренный скрипт у вас получился

Правильно, давайте и впредь выходить из цикла с помошью goto.

16 (изменено: Malcev, 2012-12-18 22:56:46)

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Понял, что для того чтобы эту всю конструкцию понять нужно внимательно читать про объекты.
А без объектов такое воплотить можно?

Что мешает ждать клавиши с помощью Input, а клики в нужных (или ненужных) координатах отлавливать иным способом?

И еще вопрос.

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

Что вы этой фразой имели в виду?

17

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Что вы этой фразой имели в виду?

Мне нечего добавить к этой фразе.

А без объектов такое воплотить можно?

Можно, воплощайте.

18

Re: AHK: A_PriorKey не всегда запоминает нажатые кнопки

Вы меня натолкнули на мысль, что можно блокировать кнопки Esc, !f4 и клики в определенной области и закрывать это окно с помощью autohotkey.