1 (изменено: Hydrogenium, 2015-05-19 14:34:54)

Тема: AHK: Переменные гор. клавиши на Win 8


KeyMy =  z

Hotkey, % "$" KeyMy, ProcFunc

return

ProcFunc:
   MsgBox, TEST
Return

Если стоит русская раскладка, то скрипт выдаёт ошибку.

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

http://f5.s.qip.ru/1q1ISRms.png

Если ставлю в начале строку кода, чтобы переключал раскладку - всё равно не помогает (как-будто не успевает преключиться):


PostMessage, 0x50,, 0x4090409,, A   ; На английский

KeyMy =  z

Hotkey, % "$" KeyMy, ProcFunc

return

ProcFunc:
   MsgBox, TEST
Return

Как быть для Win8?

p.s.
Клавиши "vk" не предлагать )

2

Re: AHK: Переменные гор. клавиши на Win 8

Переключение языка активного окна тут ни при чём. Проблема в языке самого скрипта, а он соответствует языку ввода по умолчанию, установленному в системных настройках. Хотя в 8, помнится, не всё так однозначно.

Так что лучшее решение всё-таки vk.

3 (изменено: Hydrogenium, 2015-05-19 14:35:15)

Re: AHK: Переменные гор. клавиши на Win 8

YMP пишет:

Проблема в языке самого скрипта, а он соответствует языку ввода по умолчанию, установленному в системных настройках. Хотя в 8, помнится, не всё так однозначно.

В WinXP и Win7 - соответствует языку ввода по умолчанию
В Win8 - языку текущей раскладки

Вот и требуется решение задачи для Win8 !!!

4

Re: AHK: Переменные гор. клавиши на Win 8

Такое решение есть — использование кодов виртуальных клавиш или сканкодов.

Ну или запускайте ваш скрипт из другого, который предварительно переключит "текущую раскладку".

5

Re: AHK: Переменные гор. клавиши на Win 8

Так можно попробовать:

MyHotkey := "z"
layout := RegExMatch(MyHotkey, "i)[а-я]") ? 0x4190419 : 0x4090409

WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_SYSCHARSET := 1
DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_INPUTLANGCHANGEREQUEST, Ptr, INPUTLANGCHANGE_SYSCHARSET, Ptr, layout, Ptr)

Hotkey, % MyHotkey, label, On
Return

label:
   MsgBox, % A_ThisHotkey
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: Hydrogenium, 2015-05-20 13:31:39)

Re: AHK: Переменные гор. клавиши на Win 8

teadrinker, подскажи как интегрировать твой код в структуру типа :


MyKey1 = q
MyKey2 = w
MyKey3 = e

Hotkey, % "$" MyKey1, ProcFunc1
Hotkey, % "$" MyKey2, ProcFunc2
Hotkey, % "$" MyKey3, ProcFunc3
return

ProcFunc1:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST1
   else
      Send {%MyKey1%}  
Return

ProcFunc2:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST2
   else
      Send {%MyKey2%}  
Return

ProcFunc3:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST3
   else
      Send {%MyKey3%}  
Return

7

Re: AHK: Переменные гор. клавиши на Win 8

MyKey1 = q
MyKey2 = ц
MyKey3 = e

ChangeLayout(MyKey1)
Hotkey, % "$" MyKey1, ProcFunc1

ChangeLayout(MyKey2)
Hotkey, % "$" MyKey2, ProcFunc2

ChangeLayout(MyKey3)
Hotkey, % "$" MyKey3, ProcFunc3
return

ProcFunc1:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST1
   else
      Send {%MyKey1%}
Return

ProcFunc2:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST2
   else
      Send {%MyKey2%}  
Return

ProcFunc3:
   IfWinActive, ahk_class Notepad
      MsgBox, TEST3
   else
      Send {%MyKey3%}  
Return

ChangeLayout(hotkey)  {
   static WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_SYSCHARSET := 1

   layout := RegExMatch(hotkey, "i)[а-я]") ? 0x4190419 : 0x4090409
   DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_INPUTLANGCHANGEREQUEST, Ptr, INPUTLANGCHANGE_SYSCHARSET, Ptr, layout, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Переменные гор. клавиши на Win 8

teadrinker, спасиб огромное.

А как сделать, чтобы отсылалась клавиша текущей раскладки, когда окно не Notepad ?

MyKey1 = q
Send {%MyKey1%}

Т.е. если ENG то в окно посылается "q", если РУС, то "й"

9

Re: AHK: Переменные гор. клавиши на Win 8

Hotkey, IfWinActive, ahk_class Notepad
SetHotkey("$q", "ProcFunc1")
SetHotkey("$ц", "ProcFunc2")
SetHotkey("$e", "ProcFunc3")
Return

ProcFunc1:
   MsgBox, TEST1
   Return

ProcFunc2:
   MsgBox, TEST2 
   Return

ProcFunc3:
   MsgBox, TEST3
   Return
   
SetHotkey(hotkey, label)  {
   ChangeLayout(hotkey)
   Hotkey, % hotkey, % label
}

ChangeLayout(hotkey)  {
   static WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_SYSCHARSET := 1

   layout := RegExMatch(hotkey, "i)[а-я]") ? 0x4190419 : 0x4090409
   DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_INPUTLANGCHANGEREQUEST, Ptr, INPUTLANGCHANGE_SYSCHARSET, Ptr, layout, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: Hydrogenium, 2015-05-22 00:37:59)

Re: AHK: Переменные гор. клавиши на Win 8

teadrinker, Спасиб, но ahk_class Notepad это условность. В реальности там функция с кучей условий и жёсткая привязка к Notepad не канает.


MyKey1 = q

ChangeLayout(MyKey1)
Hotkey, % "$" MyKey1, ProcFunc1
return

ProcFunc1:
   WinGet, active_id, ID, A 
   if CheckWin(active_id)
      MsgBox, TEST1
   else
      Send {%MyKey1%}
Return

ChangeLayout(hotkey)  {
   static WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_SYSCHARSET := 1

   layout := RegExMatch(hotkey, "i)[а-я]") ? 0x4190419 : 0x4090409
   DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_INPUTLANGCHANGEREQUEST, Ptr, INPUTLANGCHANGE_SYSCHARSET, Ptr, layout, Ptr)
}

Получается, что только при отправке надо определять какая раскладка и посылать нужный символ ?
Пожалуйста, подскажи как подправить ))

11

Re: AHK: Переменные гор. клавиши на Win 8

#If CheckWin(WinExist("A"))   ; здесь нужная функция
SetHotkey("$q", "ProcFunc1")
SetHotkey("$ц", "ProcFunc2")
SetHotkey("$e", "ProcFunc3")
Return

ProcFunc1:
   MsgBox, TEST1
   Return

ProcFunc2:
   MsgBox, TEST2 
   Return

ProcFunc3:
   MsgBox, TEST3
   Return
   
CheckWin(hwnd)  {
   WinGetClass, WindowClass, ahk_id %hwnd%   ; здесь вместо этого любая проверка
   if (WindowClass = "Notepad")
      Return true
}
   
SetHotkey(hotkey, label)  {
   ChangeLayout(hotkey)
   Hotkey, % hotkey, % label
}

ChangeLayout(hotkey)  {
   static WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_SYSCHARSET := 1

   layout := RegExMatch(hotkey, "i)[а-я]") ? 0x4190419 : 0x4090409
   DllCall("SendMessage", Ptr, A_ScriptHwnd, UInt, WM_INPUTLANGCHANGEREQUEST, Ptr, INPUTLANGCHANGE_SYSCHARSET, Ptr, layout, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Переменные гор. клавиши на Win 8

Спасиб )