mf.waitkey, чтобы получать не просто наименование клавиши, а и полный InputRecord.Нужно это было для того, чтобы даже с нажатым
Alt иметь возможность определить нажатый символ, в правильным регистре, и с текущей раскладкой клавиатуры.Тогда это не решилось, а сейчас дошли руки разобраться и решить эту задачу (и зафиксировать это тут в качестве ликбеза).
Итак, в апи у нас присутствуют помимо
mf.waitkey такие функции:ACTL_WAITKEYничем не поможет, т.к. может только ожидать указанную клавишу.
При этом умеет правильно обрабатывать не любой заданный InputRecord, а только то что различает FarInputRecordToName.
Т.е. например ждать нажатия модификаторов типа Shift не получится (ACTL_WAITKEY сразу возвращается).win.ExtractKeyтоже не подходит - умеет возвращать только VK в строковом виде.
Безразлична к сочетаниям клавиш, реагирует чётко на нажатия отдельных клавиш, и для модификаторов тоже.
Этим она отличается отmf.waitkey, которая возвращает нажатия целых сочетаний (а для отдельно клацнутых модификаторов - только отпускания).- В редакторе
editor.ReadInputдаёт возможность читать голые InputRecords.
Это почти то что нужно, но есть нюанс: если нажатая комбинация соответствует макросу, то функция её не получит.- Это же касается и обработчиков ProcessEditorInput / ProcessDialogEvent / ProcessConsoleInput
- Остаётся
win.ExtractKeyExи она делает именно то, чего мы от неё хотим.
editor.ReadInput и Process(Editor|Dialog|Console)Input) работает на низком уровне, а если же мы хотим получать не весь поток событий, а именно комбинации в том виде как они распознаются фаром (и используются в макросах), то этот поток легко фильтровать функцией far.InputRecordToName.Т.е. условно функциональность waitkey можно повторить таким кодом:
Code: Select all
INTERVAL = 10
waitkey = (timeout=0) ->
while timeout>0
rec = win.ExtractKeyEx!
if rec
if name = far.InputRecordToName rec
return name
win.Sleep INTERVAL
timeout -= INTERVAL
-- test
if name = waitkey(2000)
far.Message name
else
far.Message "nothing pressed"