1

Тема: AHK: Выполнение шорткатов при включённой русской раскладке

Собственно сам сабж.
Мне надо чтобы при нажатии F11 выполнялась команда ^f ;поиск
Но при включённой русской раскладке, autohotkey почему-то этот шорткат не понимает, хотя если нажать ^f в самой проге (Word) то всё ОК.
Почему так? Может есть какая-нибудь команда?
Спасибо!

2

Re: AHK: Выполнение шорткатов при включённой русской раскладке

F11:: Send, ^{vk46}        ; Ctrl-F

3

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Спасибо, теперь наконец понял для чего нужны virtual keys

4

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Я лично себе вначале скрипта всегда делаю список переменных с виртуальными кодами вида

VK_A=VK41
VK_B=VK42
...
VK_Z=VK5A

А затем в коде при необходимости использую

Send {%VK_A%}

Или вариант покороче. Создает аналогичный список. Так же ставить в начало скрипта (секцию автовыполнения)

i:=64, j:=0x40
loop 26
{
  var:=chr(++i)
  SetFormat, integer, hex
  k := SubStr(++j, 3, 2)
  VK_%var%=VK%k%
  SetFormat, integer, d
}

5 (изменено: Malcev, 2011-12-14 20:51:39)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Вот возник вопрос, а возможно ли написать отдельный скрипт, который переназначивал  бы все ссылки в виртуальные коды?
Думаю, многим, это сильно облегчило бы жизнь.
ЗЫ. И ещё непонятно, откуда растут ноги у этой проблемы?

6

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Что значит «преназначивал ссылки»?
Проблемы от того, что разработчики и основная масса пользователей обращают недостаточно внимания на факт существования языков отличных от английского.

Для быстрой вставки в скрипт vk/sc клавиш использую:


#SingleInstance force
#NoEnv
#InstallKeybdHook
#InstallMouseHook
SetBatchLines -1
Menu,Tray,Icon,main.cpl,6
Menu,Tray,Tip, VK/SC finder`npress Esc + AnyKey 
OnMessage(0x404,"AHK_NOTIFYICON")

SetFormat, Integer, H

i = 0x001

While(i < 0x1FF, i++)
   Hotkey, Esc & sc%i%, sendVKSC, On
Return

sendVKSC:
   if (A_ThisHotkey != A_PriorHotkey) {
      Clipboard := vk := "vk" SubStr(GetKeyVK(sc := "sc" SubStr(A_ThisHotkey, 11)), 3)
      k := 
   } Else (k := !k) ? Clipboard := sc : Clipboard := vk
   Controlgetfocus, ctrl, A
   PostMessage, 0x302,,,%ctrl%, A
Return

$Esc Up::
   Send, {Blind}{Esc}
Return

Esc & RButton::KeyHistory

AHK_NOTIFYICON(wParam, lParam) {
   If (lParam = 0x202) {
      SetTimer, ShowTrayMenu, -1
      return 0
   }
}

ShowTrayMenu:
   Menu, Tray, Show
Return

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

7

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Я подразумеваю создать отдельный скрипт который бы перехватывал шорткаты других скриптов и трансформировал бы их в виртуальные коды.
Или это глупости?

8 (изменено: creature.ws, 2011-12-14 23:20:31)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

//edited
Только сейчас понял что имеется в виду мои извинения.

9 (изменено: Malcev, 2011-12-14 23:37:44)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Я имею ввиду создать такой скрипт, который следил за другими запущенными скриптами AHK и делал переназначения комбинаций кнопок в виртуальные.

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

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

10

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Шорткаты в Блокноте как раз зависят от языка. Например, Alt-ф откроет меню Файл только, если включен русский язык. То, о чём Вы говорите (Ctrl-f) — это акселераторы, но они и задаются в программах через виртуальные клавиши, поэтому и работают независимо от языка.

11 (изменено: Malcev, 2011-12-15 08:15:55)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Хорошо, пускай это будут акселераторы.
Вот, что откопал на офф.форуме.
http://www.autohotkey.com/forum/topic7328.html
В принципе фурычит, но почему-то не работает в связке с ALT, SHIFT или CTRL

PS и всё-таки шорткаты это вот что
http://ru.wikipedia.org/wiki/%D0%A1%D0% … 0%B8%D1%88
Я говорю как-раз про них.

12

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Да, наверно, shortcut — понятие более общее, я его спутал с access key. Ну, в общем, Вы ведь хотели знать, почему сочетания типа Ctrl-F, Ctrl-C, Ctrl-V работают независимо от языка. Объяснение в том, что эти сочетания (акселераторы) задаются в программах виртуальными клавишами.

Ну а почему они начинают зависеть от языка, если Вы их посылаете через скрипт — потому что АНК посылает буквы, не входящие в текущую раскладку, хитрым способом, набором их на цифровой клавиатуре с удержанием Alt'a. Если, например, язык у окна русский, а Вы посылаете английскую букву, то сначала пошлётся нажатие Alt, потом несколько клавиш на цифровой клавиатуре, чтобы получился код нужного символа, потом отпускание Alt. В текстовом редакторе всё будет в порядке, напечатается нужный символ, но если буква входит в акселератор, то тут такая посылка не прокатит, т.к. получается совсем другая комбинация.

Например, если послать Ctrl-V в окно с русским языком ввода, то реально посылается вот что:

A4  038 i   d   0.22    Alt             
61  04F i   d   0.00    Num 1           
61  04F i   u   0.00    Num 1           
61  04F i   d   0.00    Num 1           
61  04F i   u   0.00    Num 1           
68  048 i   d   0.00    Num 8           
68  048 i   u   0.00    Num 8           
12  038 i   u   0.00    Alt

13 (изменено: Malcev, 2011-12-15 15:34:18)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Ну так вопрос остаётся открытым, возможно ли транскодировать на лету эти комбинации типа Ctrl-F, Ctrl-C, Ctrl-V или нет?

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

Получается, что это "вина" AHK, то, что он не преобразует комбинации клавиш в виртуальные кнопки.
И это смело можно запросить в wish-list, если таковой у них имеется?

14

Re: AHK: Выполнение шорткатов при включённой русской раскладке

А в соответствии с какой раскладкой он их должен преобразовывать? Всё, что он видит, это то, что символ с таким кодом отсутствует в текущей раскладке. Какая раскладка была активной, когда Вы печатали этот символ, он не знает. Поэтому он просто посылает код символа.

15 (изменено: Malcev, 2011-12-15 18:15:24)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Как это в какой?
Для русских символов одни виртуальные кнопки, для английских другие.
Всё по-моему логично.
Если я пишу в AHK CTRL+O, то он и должен выполнять CTRL+O независимо от раскладки.
Это ИМХО баг этой программы.
Например, если я в фотошопе создаю свои личные шорткаты, то он естесственно выполняет их при любой раскладке, потому, что как Вы уже заметили он использует виртуальные кнопки.
Чем же AHK хуже?

16

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Возьмём, к примеру клавишу, на которой символы А (рус) и F (англ). Два разных символа, а виртуальный код один и тот же. Допустим, Вам нужно послать в текстовое поле строку текста, где есть как русское А, так и английское F. По Вашей логике АНК преобразует их в один и тот же виртуальный код и в итоге, если окно на русском языке, то в текстовом поле вместо F напечатается русское А. Чтобы избежать таких казусов, символы, не входящие в текущую раскладку, и посылаются через Alt и цифровые клавиши.

17

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Не понимаю, почему он не может посылать буквы, которые я в нём пишу.
Точнее отдельные буквы может, а в связке с CTRL или ALT не может?
Пускай тогда он только все связки преобразует в виртуальные коды.

18

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Просто используйте в скрипте виртуальные коды. В чём проблема-то?

19

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Где-то видел на сайте список всех виртуальных кодов, а сейчас не могу никак найти.
Подскажите, пожалуйста.

20

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Виртуальные коды клавиш

AutoHotkey: Начинающему разработчику - Печатаю виртуальными кодами

21 (изменено: Malcev, 2012-01-26 09:20:51)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Спасибо, просто замечательный ваш скрипт "Печатаю виртуальными кодами".
Но не было бы лучше (удобнее) заместо

Esc & vk30:: Send, vk30

писать

Esc & vk30:: Send, {{}vk30{}}

чтобы скобки эти вставлялись автоматом

22 (изменено: YMP, 2012-01-26 09:30:07)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Нет, скрипт не мой (автор там указан). А скобки не всегда нужны. Даже в Ваших примерах, обратите внимание, что в названии хоткея (Esc & vk30::) скобок вокруг вирткода нет. Пришлось бы их тогда удалять в таких случаях, что неудобно.

23

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Malcev, возьмите и доработайте скрипт. Например, чтоб по горячей клавише переходить в режим вставки скобок. Он будет размещён в этой теме.

24

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Так пойдет?


$Esc Up:: Send, {Esc}
#If GetKeyState( "ScrollLock", "T" )
Esc & vk30:: Send, {{}vk30{}}
     ; ит.д.
#If !GetKeyState( "ScrollLock", "T" )
Esc & vk30:: Send, vk30
     ; ит.д.

25

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Если работает, то пойдёт, а если не работает, то нет. Вы его проверяли?

26

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Да, конечно проверял.


$Esc Up:: Send, {Esc}
#If GetKeyState( "ScrollLock", "T" )
Esc & vk30:: Send, {{}vk30{}}
Esc & vk31:: Send, {{}vk31{}}
Esc & vk32:: Send, {{}vk32{}}
Esc & vk33:: Send, {{}vk33{}}
Esc & vk34:: Send, {{}vk34{}}
Esc & vk35:: Send, {{}vk35{}}
Esc & vk36:: Send, {{}vk36{}}
Esc & vk37:: Send, {{}vk37{}}
Esc & vk38:: Send, {{}vk38{}}
Esc & vk39:: Send, {{}vk39{}}
Esc & vk41:: Send, {{}vk41{}}
Esc & vk42:: Send, {{}vk42{}}
Esc & vk43:: Send, {{}vk43{}}
Esc & vk44:: Send, {{}vk44{}}
Esc & vk45:: Send, {{}vk45{}}
Esc & vk46:: Send, {{}vk46{}}
Esc & vk47:: Send, {{}vk47{}}
Esc & vk48:: Send, {{}vk48{}}
Esc & vk49:: Send, {{}vk49{}}
Esc & vk4A:: Send, {{}vk4A{}}
Esc & vk4B:: Send, {{}vk4B{}}
Esc & vk4C:: Send, {{}vk4C{}}
Esc & vk4D:: Send, {{}vk4D{}}
Esc & vk4E:: Send, {{}vk4E{}}
Esc & vk4F:: Send, {{}vk4F{}}
Esc & vk50:: Send, {{}vk50{}}
Esc & vk51:: Send, {{}vk51{}}
Esc & vk52:: Send, {{}vk52{}}
Esc & vk53:: Send, {{}vk53{}}
Esc & vk54:: Send, {{}vk54{}}
Esc & vk55:: Send, {{}vk55{}}
Esc & vk56:: Send, {{}vk56{}}
Esc & vk57:: Send, {{}vk57{}}
Esc & vk58:: Send, {{}vk58{}}
Esc & vk59:: Send, {{}vk59{}}
Esc & vk5A:: Send, {{}vk5A{}}
Esc & vkBA:: Send, {{}vkBA{}}
Esc & vkBB:: Send, {{}vkBB{}}
Esc & vkBC:: Send, {{}vkBC{}}
Esc & vkBD:: Send, {{}vkBD{}}
Esc & vkBE:: Send, {{}vkBE{}}
Esc & vkBF:: Send, {{}vkBF{}}
Esc & vkC0:: Send, {{}vkC0{}}
Esc & vkDB:: Send, {{}vkDB{}}
Esc & vkDC:: Send, {{}vkDC{}}
Esc & vkDD:: Send, {{}vkDD{}}
Esc & vkDE:: Send, {{}vkDE{}}
Esc & vkDF:: Send, {{}vkDF{}}
Esc & vkE2:: Send, {{}vkE2{}}
#If !GetKeyState( "ScrollLock", "T" )
Esc & vk30:: Send, vk30
Esc & vk31:: Send, vk31
Esc & vk32:: Send, vk32
Esc & vk33:: Send, vk33
Esc & vk34:: Send, vk34
Esc & vk35:: Send, vk35
Esc & vk36:: Send, vk36
Esc & vk37:: Send, vk37
Esc & vk38:: Send, vk38
Esc & vk39:: Send, vk39
Esc & vk41:: Send, vk41
Esc & vk42:: Send, vk42
Esc & vk43:: Send, vk43
Esc & vk44:: Send, vk44
Esc & vk45:: Send, vk45
Esc & vk46:: Send, vk46
Esc & vk47:: Send, vk47
Esc & vk48:: Send, vk48
Esc & vk49:: Send, vk49
Esc & vk4A:: Send, vk4A
Esc & vk4B:: Send, vk4B
Esc & vk4C:: Send, vk4C
Esc & vk4D:: Send, vk4D
Esc & vk4E:: Send, vk4E
Esc & vk4F:: Send, vk4F
Esc & vk50:: Send, vk50
Esc & vk51:: Send, vk51
Esc & vk52:: Send, vk52
Esc & vk53:: Send, vk53
Esc & vk54:: Send, vk54
Esc & vk55:: Send, vk55
Esc & vk56:: Send, vk56
Esc & vk57:: Send, vk57
Esc & vk58:: Send, vk58
Esc & vk59:: Send, vk59
Esc & vk5A:: Send, vk5A
Esc & vkBA:: Send, vkBA
Esc & vkBB:: Send, vkBB
Esc & vkBC:: Send, vkBC
Esc & vkBD:: Send, vkBD
Esc & vkBE:: Send, vkBE
Esc & vkBF:: Send, vkBF
Esc & vkC0:: Send, vkC0
Esc & vkDB:: Send, vkDB
Esc & vkDC:: Send, vkDC
Esc & vkDD:: Send, vkDD
Esc & vkDE:: Send, vkDE
Esc & vkDF:: Send, vkDF
Esc & vkE2:: Send, vkE2

27

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Esc & vk30::
Esc & vk31::
Esc & vk32::
Esc & vk33::
Esc & vk34::
Esc & vk35::
Esc & vk36::
Esc & vk37::
Esc & vk38::
Esc & vk39::
Esc & vk41::
Esc & vk42::
Esc & vk43::
Esc & vk44::
Esc & vk45::
Esc & vk46::
Esc & vk47::
Esc & vk48::
Esc & vk49::
Esc & vk4A::
Esc & vk4B::
Esc & vk4C::
Esc & vk4D::
Esc & vk4E::
Esc & vk4F::
Esc & vk50::
Esc & vk51::
Esc & vk52::
Esc & vk53::
Esc & vk54::
Esc & vk55::
Esc & vk56::
Esc & vk57::
Esc & vk58::
Esc & vk59::
Esc & vk5A::
Esc & vkBA::
Esc & vkBB::
Esc & vkBC::
Esc & vkBD::
Esc & vkBE::
Esc & vkBF::
Esc & vkC0::
Esc & vkDB::
Esc & vkDC::
Esc & vkDD::
Esc & vkDE::
Esc & vkDF::
Esc & vkE2::SendRaw, % GetKeyState("ScrollLock", "T")
? "{"SubStr(A_ThisHotkey, 7)"}":SubStr(A_ThisHotkey, 7)

28

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Malcev, возьмите и доработайте скрипт. Например, чтоб по горячей клавише переходить в режим вставки скобок. Он будет размещён в этой теме.

Что-то я ничего не вижу.

29

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Шорткаты в Блокноте как раз зависят от языка. Например, Alt-ф откроет меню Файл только, если включен русский язык.

А возможно ли каким-нибудь образом заставить посылать Alt+f независимо от текущей раскладки?
Нужно чтобы при нажатии Alt+f открывалось меню в английском блокноте независимо от раскладки.

30

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Судя по молчанию, нельзя внести в программу то, что в ней изначально незапрограмированно.
И вариант только один - проверять текущую раскладку и если она русская, менять на английскую  и посылать этот "key modifier".
Верно?

31

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Можно послать окну сообщение WM_SELECT, но нужно будет предварительно узнать индекс нужного пункта меню(через spy++).

32 (изменено: creature.ws, 2012-09-14 09:20:33)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

#IfWinActive ahk_class Notepad
    !vk46:: ; alt+f в любой раскладке
        Input, var , L1BI, {vk41}{vk4F}{vk53}{vk4E} ; нажатие «A» «S» «O» «N»  — конец ожидания
        StrLen(ErrorLevel) > 7 && var := SubStr(ErrorLevel, 0) ; если была нажата клавиша из списка выше — её имя в конце строки содержащейся в Errorlevel 
        if (var = "A")
            WinMenuSelectItem,,, File, Save As
        else if (var = "S")
            WinMenuSelectItem,,, File, Save
        else if (var = "O")
            WinMenuSelectItem,,, File, Open
        else if (var = "N")
            WinMenuSelectItem,,, File, New
        return
#if

~Alt Up::Input

WinMenuSelectItem применим если вам таки нужно чего-то добиться от приложения, если цель — «просто хочется заставить работать акселераторы англоязычного меню безразлично от раскладки» — ищите иной способ.

33

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Про WinMenuSelectItem знаю.
Проблема в том, что в моем случае этих акселераторов в меню нету.
Буду искать иной способ.
Спасибо!

34

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Проблема в том, что в моем случае этих акселераторов в меню нету.

Этих нету, а другие есть?

35 (изменено: Malcev, 2012-09-14 12:08:19)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Да, есть. Стрелки вверх и вниз
Это примерно, как если мы зайдем в Блокнот нажмем format->font
И потом нужно выйти на шрифт Windings.
Можно нажать просто "w" а можно стрелочками, да PgDn.
Но только мой случай со шрифтами не связан и "w" в ней работает, как акселератор, то есть вставить ее из буфера обмена нельзя

36 (изменено: creature.ws, 2012-09-14 12:15:01)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

А какое отношение тогда «акселераторы», «меню» имеют к некому списку с прокруткой?

WinMenuSelectItem ищет указанные пункты меню, и отправляет WM_COMMAND c wParam равным id указанного пункта.
Команде безразлично, есть у пункта возможность вызвать его нажатием клавиши при зажатом альте, или нет.

Если WinMenuSelectItem не может выбрать указанный пункт из меню программы — меню программы нестандартное.

37

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Но только мой случай со шрифтами не связан и "w" в ней работает, как акселератор, то есть вставить ее из буфера обмена нельзя.

38 (изменено: creature.ws, 2012-09-14 12:16:52)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

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

39

Re: AHK: Выполнение шорткатов при включённой русской раскладке

С акселераторами я все-таки поспешил.
Это больше напоминает некий список без прокрутки.
Программа Adobe Premiere CS5.5
http://s7.postimage.org/vwh672fsr/Untitled.jpg
При нажатии "H" становится активным режим "Hard Light", а при "Р" не становится.

40 (изменено: creature.ws, 2012-09-14 12:42:34)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Уже теплее, «не всё то меню, что всплывает».
Control > Choose, N

Пример для понимания

Gui, Add, DropDownList,, Black|White|Red|Green|Blue
Gui, Show
; Запустить, посмотреть на отсутствие выбранного пункта в выпадающем списке, нажать пробел, понять, применить к своему случаю.
Space::Control, Choose, 5, ComboBox1, ahk_class AutoHotkeyGUI

При использовании этой команды вообще пропадает необходимость активировать меню, список, окно программы.

41 (изменено: Malcev, 2012-09-14 13:37:30)

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Вот не знал о такой команде.
Спасибо!
Но проблема в том, что у выпадающего списка нет своего ClassNN
То есть у него такой же ClassNN, как и у всего окна, в котором он находится.

42

Re: AHK: Выполнение шорткатов при включённой русской раскладке

Тут и сказке конец

Надо же, а на вид вполне стандартный DropDownList…