1 (изменено: Hydrogenium, 2013-06-05 15:12:51)

Тема: AHK: Как корректно задать переменный хоткей ?

вообщем надо задать хоткей через переменную и чтобы работало например по F9
думаю понятно изъяснился
или я не корректно задаю виртуальную клавишу ?
подскажите пожалуйста

;~  установка хоткеев
MyKey = F9


;~ вызов------------------------------------------------------
MyKey::   
    WinGet, active_id, ID, A 
    CoordMode, Mouse, Client        
    Click %x%, %y% 
Return

2

Re: AHK: Как корректно задать переменный хоткей ?

См. команду Hotkey.

3

Re: AHK: Как корректно задать переменный хоткей ?

YMP пишет:

См. команду Hotkey.

я тут и спросил, т.к. не догоняю справку

4 (изменено: Hydrogenium, 2013-06-05 17:14:10)

Re: AHK: Как корректно задать переменный хоткей ?

в одном коде

+ открыть спойлер

;=====Запуск Mozilla Firefox
; (WIN+A)   
;#a::
FireFox:
if (fnWinClose(arMainKey[fnRetIndexOfHotkey(A_ThisHotkey),iAhkC_WinT]))
  return
Run, %ProgSysPath32%Mozilla Firefox\firefox.exe
return











arMainKey := [[cNone,cNoLbL,cSps] ; Если 3-й элемент cNone то конец массива
      ,[cNone,cNoLbL,"---------------- Запуск основных приложений"]
      ,[cNone,"Pidgin","Запуск Pidgin","ahk_class gdkWindowToplevel",cNone,cWin,"Q"]
      ,[cNone,"FireFox","Запуск Mozilla FireFox","Mozilla Firefox",cNone,cWin,"A"]
      ,[cNone,"Thunderbird","Запуск Mozilla Thunderbird","Thunderbird",cNone,cWin,"S"]
      ,[cNone,"TotalCommander","Запуск Total Commander","Total Commander",cNone,cWin,"X"]
      ,[cNone,"Notepad","Запуск Notepad++","Notepad++",cNone,cWin,"Z"]
      ,[cNone,"Photoshop","Запуск Adobe Photoshop CS5 (64 Bit)","ahk_class Photoshop",cNone,cWin,"F2"]
      ,[cNone,"OscarEditor","Запуск OSCAR Mouse Script Editor","Oscar Editor",cNone,cWin,"F4"]
      ,[cNone,"AnVirTaskManager","Запуск AnVir Task Manager","AnVir Task Manager",cNone,cCrush,cCtrl,cWin,"Z"]
      ,[cNone,"BackUp","Windows BackUp","Acronis True Image Home",cNone,cWin,"F9"]
      ,[cNone,"UpDate","Windows UpDate","Центр обновления Windows",cNone,cWin,"F10"]
      ,[cNone,cNoLbL,"---------------- Запуск функций McAfee"]
      ,[cNone,"vseOpenCon","Открыть консоль","Консоль VirusScan",cNone,cWin,"F5"]
      ,[cNone,"vseStopScan","Остановить целевое сканирование",cNone,cNone,cCtrl,"F5"]
      ,[cNone,"vseOnAccessScanLog","Журнал сканирования при обращении к файлу",cNone,cNone,cWin,"F6"]
      ,[cNone,"vseAccessProtectionLog","Журнал защиты доступа",cNone,cNone,cCtrl,"F6"]
      ,[cNone,"vseScanON","ON Сканирование при обращении к файлу",cNone,cNone,cWin,"F7"]
      ,[cNone,"vseScanOFF","OFF Сканирование при обращении к файлу",cNone,cNone,cCtrl,"F7"]
      ,[cNone,cNoLbL,"---------------- Разное"]
      ,[cNone,"CloseActiveWin","Закрыть активное окно",cNone,cNone,cWin,"W"]
      ,[cNone,"ToggleSound","Переключение звука Колонки/Наушники",cNone,cNone,cWin,"Tab"]
      ,[cNone,"GameKeyOnOff","On/Off игровых клавиш",cNone,cNone,cWin,"F12"]
      ,[cNone,"HelpKey","Вызов справки по клавишам","Справка по клавишам ",cNone,cWin,"F1"]
      ,[cNone,cNoLbL,"---------------- Перезапуск Windows"]
      ,[cNone,"WinRestart","Перезапуск Windows",cNone,cNone,cCrush,cCtrl,cWin,"F10"]
      ,[cNone,"PowerOff","Выключение компьютера",cNone,cNone,cCrush,cCtrl,cWin,"F11"]
      ,[cNone,"WinBlock","Блокировка Windows",cNone,cNone,cCrush,cCtrl,cWin,"F12"]
      ,[cNone,cNoLbL,cNone]]
;========================================================================     
;++++++Сканирование массива и генерация хоткеев и прочей ерунды++++++++++
;========================================================================
;---Определение размера массива и валидности меток
i := 1
while (arMainKey[i,iText]) ; выполнять пока arMainKey[i,iText] != cNone
    {
    if (!IsLabel(arMainKey[i, iLabels]))
     {
      tTitl := "Error in script generation"
      tInd  := "An error of array declaration is in an index = " i
      tLbl  :=  """"arMainKey[i, iLabels]"""" " label is not defined or does not exist"
      tTxt  := сErrOfExit
      MsgBox ,0
            , %tTitl%
            , %tInd% `n`n %tLbl% `n`n %tTxt%
            ,30
      ExitApp
     }
     vLenTMP := StrLen(arMainKey[i,iExTxt])
     if (vLenTMP > vLenExTxt)
         vLenExTxt := vLenTMP
    i++
    }
cSizeA := i
vLenExTxt += 35

;---Генерация имён клавиш и хоткеев (парсер)
i := 1
loop %cSizeA%
{
  j := iHKey
  bfName := cNone
  bfHotK := cNone
  if ((arMainKey[i,iLabels]<>cNoLbL) and (arMainKey[i,iHKey]=cNone)) ; Проверка отсутствия HotKey для метки
      {
        vLbl := arMainKey[i,iLabels]
        MsgBox ,0
               , Error
               , "%vLbl%"  for the label is not defined hotkey `n`n %сErrOfExit%
               ,10
        ExitApp
     }
   vPriNoKey := 0
   while (arMainKey[i,j])
   {
    bfHotK := bfHotK fnAssigKey(arMainKey[i,j],arAssigKey*)
    k := 1
    vFlgNoKey := false
    while (arAssigKeyNo[k] and (!vFlgNoKey))
     {
      if (arMainKey[i,j]=arAssigKeyNo[k])
          {
          vFlgNoKey := true
          vPriNoKey := j
          ;msgbox vPriNoKey := %vPriNoKey%
          }
        else
          vFlgNoKey := false
      k++
     }
     if (!vFlgNoKey)
      {
       if (j = iHKey)
           bfName := arMainKey[i,j]
        else
          if (vPriNoKey=iHKey)
             bfName := arMainKey[i,j]
            else
             bfName := bfName cGap arMainKey[i,j]
          vPriNoKey := 0   
      }
    j++
   }
  if (bfName) 
    {
      arMainKey[i,iKeys] := bfName     ; Пишем названия клавиш
      vLabel := arMainKey[i,iLabels]   ; Генерируем HotKey
      arMainKey[i,iHKeyN] := bfHotK    ; Заносим акроним в массив
      HotKey %bfHotK%,%vLabel%, %cOnHK% UseErrorLevel  ; Включение HotKey
      vEL := ErrorLevel
      if (!vEL) and (!fnErrDub(bfHotK,vLabel,i,arMainKey*))
             vEL := 100 ; Моя ошибка ( все мои ошибки больше 99)
      vHK := "HotKey" cSps bfHotK cSps cComma cSps vLabel
      if (vEL)
        {
        if (vEL=1)
          vELTxt := "The label name that does not exist"
        if (vEL=2)
          vELTxt := "Re-use of combinations of hot keys." 
        if (vEL=3)
          vELTxt := "Hot key modifier is not supported." 
        if (vEL=4)
          vELTxt := "This shortcut is not suitable for emulation" 
        if (vEL=5)
          vELTxt := "This keys of accelerators do not exist." 
        if (vEL=6)
          vELTxt := "Non-existent variant of existent hotkey" 
        if ((vEL=98) or (vEL=99))
          vELTxt := "Other errors"
        if (vEL=100)
          vELTxt := "This hotkey is already used"           
        MsgBox 0
               ,Failed to use hotkeys
               ,Еrror in %vHK% `n Еrror= %vELTxt% `n ErrorLevel= %vEL% `n `n %сErrOfExit%
               ,15
        ExitApp
        } 
    }
  i++
}
;fnHotKeyOnOff(,"sasa1","sasa2")
;или
;vTmpArr := ["tata1","tata2","tata3"]
;fnHotKeyOnOff(false,vTmpArr*)
;----------------------------Конец стартовых определений --------------------------------
return

;msgbox % a[2,3] " " a[3,1]
;o := {a:{a1:1,a2:2,a3:3},b:{b1:1,b2:2,b3:3},c:{c1:1,c2:2,c3:3}}
;msgbox % o.a.a1 " " o["a", "a2"]
;=============================================================================

судя по этому коду

[cNone,"FireFox","Запуск Mozilla FireFox","Mozilla Firefox",cNone,cWin,"A"]

когда кликается WIN+A срабатывает вызов FireFox

а как произошло назначение WIN+A -> FireFox, мне не понятно

5

Re: AHK: Как корректно задать переменный хоткей ?

Мне тоже не понятно, слишком портянка большая.
По предыдущему вопросу:


Key = F9
Hotkey, %Key%, Proc
Return

Proc:
    MsgBox, Hello, world!
Return

6 (изменено: Hydrogenium, 2013-06-06 21:58:54)

Re: AHK: Как корректно задать переменный хоткей ?

YMP, спасиб
у меня след. вопрос

я сделал

Key = z

и теперь когда я жму z, то "z" не печатается, как исправить положение ?

для тех кто в танке:
хоткей я использую тока для определённого окна и в повседневной работе с другими окнами его блокировка не нужна

7

Re: AHK: Как корректно задать переменный хоткей ?

Задайте его для определённого окна.


Hotkey, IfWinActive, ahk_class Notepad
Hotkey, %Key%, Proc
Hotkey, IfWinActive

8

Re: AHK: Как корректно задать переменный хоткей ?

YMP пишет:

Задайте его для определённого окна.


Hotkey, IfWinActive, ahk_class Notepad
Hotkey, %Key%, Proc
Hotkey, IfWinActive

Key = z

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, %Key%, Proc
Hotkey, IfWinActive

Return

Proc:
    MsgBox, Hello, world!
Return

буква "z", всё равно не пропечаталась

9

Re: AHK: Как корректно задать переменный хоткей ?

Где?

10

Re: AHK: Как корректно задать переменный хоткей ?

YMP пишет:

Где?

в блокноте

11

Re: AHK: Как корректно задать переменный хоткей ?

Ну дык хоткей к Блокноту и привязан. А действие хоткея — меседжбокс.

12

Re: AHK: Как корректно задать переменный хоткей ?

Видимо, тс желает, чтоб в блокноте и z печаталась, и окно выскакивало?

Key = ~z

13

Re: AHK: Как корректно задать переменный хоткей ?

Irbis пишет:

Видимо, тс желает, чтоб в блокноте и z печаталась, и окно выскакивало?

Key = ~z

да, я вроде на русском же пишу

14

Re: AHK: Как корректно задать переменный хоткей ?

Irbis пишет:

Видимо, тс желает, чтоб в блокноте и z печаталась, и окно выскакивало?

Но сказать, видимо, стесняется.

15

Re: AHK: Как корректно задать переменный хоткей ?

YMP пишет:
Irbis пишет:

Видимо, тс желает, чтоб в блокноте и z печаталась, и окно выскакивало?

Но сказать, видимо, стесняется.

Нет, кто-то прочитать стесняется )))

и теперь когда я жму z, то "z" не печатается, как исправить положение ?

16

Re: AHK: Как корректно задать переменный хоткей ?

Может так?

Key = z

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, %Key%, Proc
Hotkey, IfWinActive

Return

Proc:
    Send, z
    MsgBox, Hello, world!
Return

17

Re: AHK: Как корректно задать переменный хоткей ?

Ekklesiast пишет:

Нет, кто-то прочитать стесняется )))

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

18 (изменено: Hydrogenium, 2013-06-30 08:11:55)

Re: AHK: Как корректно задать переменный хоткей ?

как сделать чтобы посылалось в нужное окно, а не по привязке ?

ahk_class Notepad

типа

+ открыть спойлер


Key = z

WinGet, active_id, ID, A  
WinGetTitle, this_title, ahk_id %this_id%  
    if (this_title = "Безымянный - Блокнот") 
    {
        Hotkey, IfWinActive, ahk_id %this_id%  
        Hotkey, %Key%, Proc
        Hotkey, IfWinActive
    }
Return

Proc:
    Send, %Key%
    MsgBox, Hello, world!
Return

19

Re: AHK: Как корректно задать переменный хоткей ?

Key = ~z

Hotkey, %Key%, Proc
Return

Proc:
    if WinActive("ahk_id" active_id)
       MsgBox, Hello, world!
Return

F12:: WinGet, active_id, ID, A

20

Re: AHK: Как корректно задать переменный хоткей ?

Irbis, а использовать тока одну кнопку "z" ни как ?

типа как-то так :

+ открыть спойлер
Key = ~z

Hotkey, %Key%, Proc
Return

Proc:     
    if CheckTest()
        MsgBox, Hello, world!    
Return




CheckTest()
{    
    Res := false 
    
    WinGet, active_id, ID, A  
    WinGetTitle, this_title, ahk_id %this_id%    
   
    if (this_title <> "")            
        if (this_title = "Текстовый документ.txt")                
            Res := true  
        
    return Res 
}

21 (изменено: Irbis, 2013-07-01 03:02:04)

Re: AHK: Как корректно задать переменный хоткей ?

Ekklesiast пишет:

как сделать чтобы посылалось в нужное окно, а не по привязке ?

Видимо, сия фраза имела какой-то иной, сакральный смысл, мной так и не понятый.

Что понимать под "нужным" окном, можно пояснить? И почему, когда мы таки определимся с "нужным" окном, "привязывать" действие к нему мы категорически не будем?

Если предположить, что требуется привязка к первому из найденных окон с нужным параметром (заголовок), и на остальные окна с таким заголовком скрипт не должен реагировать, тогда так:

Key = ~z

Hotkey, %Key%, Proc
Return

Proc:
   if !id
      WinGet, id, id, Безымянный — Блокнот
   if WinActive("ahk_id" id)
      MsgBox, Hello, world!
Return

22 (изменено: Hydrogenium, 2013-07-01 09:15:41)

Re: AHK: Как корректно задать переменный хоткей ?

Irbis

CheckWindow(this_id)
{    
    Res := false    
  
    WinGetTitle, this_title, ahk_id %this_id%    
   
    if (this_title <> "")            
        if (this_title = "Безымянный — Блокнот")                
            Res := true     
        
    return Res  
}

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

WinGet, id, id, Безымянный — Блокнот

почему AHK программисты всегда локально мыслят и привязываются насмерть к определённым окнам ? )))))
"Безымянный — Блокнот и.тп." - это временное окно для примера, а не константное



вроде так работает:

+ открыть спойлер
Key = ~z

Hotkey, %Key%, Proc
Return

Proc:
    if !id
    {
        WinGet, active_id, ID, A 
        if CheckWindow(active_id)
            if WinActive("ahk_id" active_id)
                MsgBox, Hello, world!
    }
Return


CheckWindow(this_id)
{    
    Res := false    
  
    WinGetTitle, this_title, ahk_id %this_id%    
   
    if (this_title <> "")            
        if (this_title = "Безымянный — Блокнот")                
            Res := true     
        
    return Res  
}

23 (изменено: Irbis, 2013-07-01 14:29:57)

Re: AHK: Как корректно задать переменный хоткей ?

Ekklesiast пишет:

почему AHK программисты всегда локально мыслят и привязываются насмерть к определённым окнам ? )))))
"Безымянный — Блокнот и.тп." - это временное окно для примера, а не константное

Забавное рассуждение. То есть то, что вы запихнули строку "Безымянный — Блокнот" внутрь процедуры CheckWindow, автоматически делает ее переменной, а не постоянной? Я понимаю, что этот заголовок для образца, и его менять никто не запрещает.

24 (изменено: Hydrogenium, 2013-12-19 10:59:19)

Re: AHK: Как корректно задать переменный хоткей ?

Задача:
При нажатии на "z" если активное окно = нужное, то клик, иначе печатаем "z".

Не получается печатать "z".
Подскажите как исправить !

+ открыть спойлер

Key = z

Hotkey, %Key%, Proc
Return

Proc:   
   WinGet, active_id, ID, A
   
   if CheckWin(active_id)           
      Click 100, 100 
   else
   {
      Send, %Key%
      sleep, 200
   }
Return

CheckWin(this_id)
{
   Res := false 
   
   sym = Текстовый        

   WinGetTitle, this_title, ahk_id %this_id%
    
   if (this_title <> "") 
      IfInString, this_title, %sym%                  
         Res := true
        
   Return Res    
}

25

Re: AHK: Как корректно задать переменный хоткей ?

А где this_id присваивается значение?

26 (изменено: Hydrogenium, 2013-12-19 12:44:55)

Re: AHK: Как корректно задать переменный хоткей ?

ypppu пишет:

А где this_id присваивается значение?

CheckWin(active_id) -> CheckWin(this_id)

27

Re: AHK: Как корректно задать переменный хоткей ?

Ekklesiast, не нужно код стыдливо прятать под спойлер.
Вот пример:

key := "z"

Gui, 1:Margin, 0, 0
Gui, 1:Add, Edit, w250 h100
Gui, 1:Show, % "x" A_ScreenWidth//2 -255, Клик

Gui, 2:Margin, 0, 0
Gui, 2:Add, Edit, w250 h100
Gui, 2:Show, % "x" A_ScreenWidth//2 + 5, Посыл буквы

SetFormat, IntegerFast, H
vk_code := "vk" SubStr(GetKeyVK(key), 3)
Hotkey, % "$" vk_code, Label, On
return

Label:
   WinGetActiveTitle, Title
   Send, % Title = "Клик" ? "{Click, 100, 100}" : "{" vk_code "}"
   return

Обратите внимание на использование в определении горячей клавиши символа "$", что предотвращает посыл клавишей самой себя.

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

28 (изменено: Hydrogenium, 2013-12-19 17:36:18)

Re: AHK: Как корректно задать переменный хоткей ?

teadrinker пишет:

Ekklesiast, не нужно код стыдливо прятать под спойлер.

А я думал что: "спойлерить код, длиною в пол страницы" - это в негласное правило корректного форматирования. ))))

teadrinker пишет:

Вот пример:

Спасиб, разобрался.

29

Re: AHK: Как корректно задать переменный хоткей ?

Ekklesiast пишет:

спойлерить код, длиною в пол страницы

Неважно, какой размер кода, всё равно он ограничивается размером своего окна при применении соответствующего тега.

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

30

Re: AHK: Как корректно задать переменный хоткей ?

Объясните, пожалуйста, в каких случаях необходим такой "хоткей через переменную", который описывается в данной теме. Было бы еще яснее, если будет представлен пример сценария, в котором горячая клавиша без данной функции не работает. Спасибо!

31

Re: AHK: Как корректно задать переменный хоткей ?

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

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

32

Re: AHK: Как корректно задать переменный хоткей ?

teadrinker, спасибо! Про смену горячих клавиш посредством оконного интерфейса понятно. А имеется ли на форуме пример оформления такого интерфейса? Или, может, кто-нибудь сделает выдержку из существующего скрипта с соответствующей функцией? Если это оффтоп, то создам отдельную тему.

33

Re: AHK: Как корректно задать переменный хоткей ?

В документации есть команда Hotkey.

И элемент управления GUI "Hotkey":

Валентина Гаврикова пишет:

горячая клавиша сохраняется в выходной переменной, ассоциированной с элементом управления