1

Тема: AHK: Как применять #if,если хоткей выполняется через метку?

Я уже применял #if для ограничения срабатывания горячей клавиши только в определённых окнах.

Hotkey, IfWinActive/Exist [, WinTitle, WinText]

тоже может выполнить эту функцию, но как поступить, если проверка на "правильность" заголовка окна - целая процедура на 30 строк?
  Можно конечно постоянно перебирать все окна и хранить в памяти заголовки нужных, но мне кажется должен быть предусмотрен более простой способ.
  Помогите, пожалуйста, им воспользоваться.
  Заранее, спасибо!

2 (изменено: Hydrogenium, 2013-08-15 22:20:14)

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Pokerist пишет:

Я уже применял #if для ограничения срабатывания горячей клавиши только в определённых окнах.

Hotkey, IfWinActive/Exist [, WinTitle, WinText]

тоже может выполнить эту функцию, но как поступить, если проверка на "правильность" заголовка окна - целая процедура на 30 строк?
  Можно конечно постоянно перебирать все окна и хранить в памяти заголовки нужных, но мне кажется должен быть предусмотрен более простой способ.
  Помогите, пожалуйста, им воспользоваться.
  Заранее, спасибо!

я делаю так:

+ открыть спойлер
MyKey = ~y

Hotkey, %MyKey%, MyProc

MyProc:   
    WinGet, active_id, ID, A         
    if WinActive("ahk_id" active_id)
    {   
         if CheckWin() ; функция проверки окна
             MyAction() ;
    }
Return

3

Re: AHK: Как применять #if,если хоткей выполняется через метку?

целая процедура на 30 строк?

Так вы приведите эти 30 строк, а там уже будет...

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

4

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Довольно заморочливо, особенно, если хоткеев много.

5

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Хоткеев много, а MyProc одна...
И всё же в контексте вашего вопроса думаю что уместно привести и енто самое секретное условие срабатывания хоткея. Как, Вы считаете?

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

6

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Pokerist, а вы для какого рума пишите скрипт ? ))))

7 (изменено: Pokerist, 2013-08-16 00:30:09)

Re: AHK: Как применять #if,если хоткей выполняется через метку?

serzh82saratov пишет:

И всё же в контексте вашего вопроса думаю что уместно привести и енто самое секретное условие срабатывания хоткея. Как, Вы считаете?

  Не стоит. Мне мои кривые 30 строк понятны и близки. Я понимаю, что их можно превратить в красивые 6-7, но через неделю я потрачу час чтобы понять что там и как. Главное, что они работают  с устраивающей меня скоростью и дают нужный результат.
  Если бы сокращение процедуры влияло на возможность применения #if - тогда другое дело.


Хоткеев много, а MyProc одна...

  Что Вы имеете ввиду? Всё равно ведь под каждый хоткей надо создавать собственную, поскольку "MyAction()" для каждого своя.

8

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Ekklesiast пишет:

Pokerist, а вы для какого рума пишите скрипт ? ))))

  Для собственного ))

9 (изменено: serzh82saratov, 2013-08-16 00:44:49)

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Мне мои кривые 30 строк понятны и близки. Я понимаю, что их можно превратить в красивые 6-7

Да боже упаси их трогать руками, я то про:


Global Var := 1

#IF State()
#IF
Hotkey, IF, State()
Hotkey, 1, Hotkey ; Нажми 1 
Hotkey, IF
Return

State() {
    IF Var
        Return 1
    Return 0
}
    
Hotkey:
    MsgBox Нажал 1? Значит Var имеет значение.

а вы про что?

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

10 (изменено: serzh82saratov, 2013-08-16 00:46:10)

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Что Вы имеете ввиду? Всё равно ведь под каждый хоткей надо создавать собственную, поскольку "MyAction()" для каждого своя.

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

АП. А в случае #if и проверять не надо.

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

11 (изменено: Pokerist, 2013-08-16 01:32:24)

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Вот так даже мне понятно получается:


Global k1 := "-"
Global k2 := "q"

#IF State()
#IF
Hotkey, IF, State()
Hotkey, %k1%, Label1 
Hotkey, %k2%, Label2
Hotkey, IF
Return

State() {
    WinGetActiveTitle, Name
    IfInString, Name, Блокнот
        Return 1
    Return 0
}
    
Label1:
    {
    Send, {+}
    }
return
    
Label2:
    {
    Send, qwerty
    }
return    

       Работает, компактно пишется, легко находится, хотя принцип работы всей комбинации из от "#IF State" до "Hotkey, IF" мне ясен постольку-поскольку. По крайней мере я никогда не догадался поставить между #if только функцию проверки, а все хоткеи заключить между "Hotkey, IF"

   Спасибо!

12

Re: AHK: Как применять #if,если хоткей выполняется через метку?

принцип работы всей комбинации из от "#IF State" до "Hotkey, IF" мне ясен постольку-поскольку.

Я уже сам запутался. Всё понятно, или наоборот всё стало непонятно.

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

13

Re: AHK: Как применять #if,если хоткей выполняется через метку?

Почти как в том "Ералаше": "Я понял что они не пересекаются! Я не понял почему они не пересекаются!"   
  Нажатие на "-" обращается к
Hotkey, %k1%, Label1
это строка обращается к
Hotkey, IF, State()
она в свою очередь запускает
State()
и получив ответ решает запускать Label1 или нет. Вроде понятно, но никогда в справке я ничего не видел по поводу необходимости завершения с помощью "Hotkey, IF". По аналогии с #IF я догадываюсь зачем это нужно, но вот нигде этого не встречал.

14

Re: AHK: Как применять #if,если хоткей выполняется через метку?

serzh82saratov
А можете предложить вариант, как делать динамические комбо с клавишами как аналог определений типа 1 & 2::.
То есть зажатие клавиши 1 делает ее шифтом и включает хоткей для клавиши 2, а при отжатии отключает обратно.

Спрашиваю потому, что столкнулся со странным глюком одиночный нажатий при определении комбо с этими клавишами.


1::1 ; срабатывает для одиночных нажатий клавиши при отжатии клавиши
2::2 ; -//-
1 & 2::3 ; срабатывает при нажатии 1 + 2, автоповтор
2 & 1::4 ; срабатывает при нажатии 2 + 1, -//-

Если просто нажать и отпустить 1 на разных устройствах ввода, то работает нормально. То же самое для 2.
Если зажать пробел и потом нажать и отпустить 1 или 2 на одном устройстве ввода, то тоже работает нормально.
Если зажать пробел на одном устройстве ввода, а 1 или 2 на другом - одиночное нажатие и отпускание не работает, хотя комбо работают нормально.
Возможно можно решить эту проблему через динамические назначения хоткеев?
Что-то типа такого :


1::
  down_1:=1
  hotkey 2,down_1_2
return
1 up::
  hotkey 2,off
  if down_1
    send 1
return
2::
  down_2:=1
  hotkey 1,down_2_1
return
2 up::
  hotkey 1,off
  if down_2
    send 2
return
down_1_2:
  send 3
  down_1:=0
return
down_2_1:
  send 4
  down_2:=0
return

Проблема в том, что у меня так нормально не работает - после первого же отключения хоткея одиночное нажатие клавиши перестает работать вообще.