FarNameToInputRecord / FarInputRecordToName

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 14434
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 86 times
Been thanked: 486 times
Contact:

FarNameToInputRecord / FarInputRecordToName

Post by John Doe »

Комбинация клавиш CtrlNumLock для системы означает VK_PAUSE, но фар об этом не знает.
Соответственно функция FarNameToInputRecord работает неправильно.

Нельзя ли исправить?
http://bugs.farmanager.com/view.php?id=2947

P.S.
Есть и другие клавиши, меняющие в сочетании с Ctrl значение vk.

Ctrl+ScrollLock => CtrlBreak == VK_CANCEL
Ctrl+Pause => CtrlBreak == VK_CANCEL, scancode => 70 (как у ScrollLock)

Однако тут у FarNameToInputRecord проблем нет.
Last edited by John Doe on Wed 01 May, 2024 22:56, edited 1 time in total.
User avatar
HaRT
Moderator
Posts: 11370
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 407 times

FarNameToInputRecord / FarInputRecordToName

Post by HaRT »

Если кто-то будет это менять, то прошу заметить, что на USB-клавиатуре всё несколько иначе и в чём-то даже сложнее.
Вот что пишет [i]KeySpy2.exe[/i] из комплекта старого доброго Keyboard Maniac:

(Если что, у меня клавиатура марки Genius от KYE Systems.)
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 14434
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 86 times
Been thanked: 486 times
Contact:

FarNameToInputRecord / FarInputRecordToName

Post by John Doe »

HaRT wrote: на USB-клавиатуре всё несколько иначе и в чём-то даже сложнее.
У меня USB клавиатура, и что это меняет в плане виртуальных клавиш?
User avatar
HaRT
Moderator
Posts: 11370
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 407 times

FarNameToInputRecord / FarInputRecordToName

Post by HaRT »

John Doe wrote: что это меняет в плане виртуальных клавиш?
Понятия не имею.
Я же не знаю, на каком уровне Фар работает с событиями ввода.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 14434
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 86 times
Been thanked: 486 times
Contact:

FarNameToInputRecord / FarInputRecordToName

Post by John Doe »

Code: Select all

far.InputRecordToName {
  ControlKeyState = 58,
  EventType = 1,
  KeyDown = true,
  RepeatCount = 1,
  UnicodeChar = "\000",
  VirtualKeyCode = 16,
  VirtualScanCode = 42
}
Возвращает CtrlAltShiftRelease (а в некоторых случаях CtrlAltShiftPress)

Если же изменить умолчательное значение System.CASRule на 0, то возвращается CtrlAltShift►
Странно это.
Shmuel
Posts: 7124
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 47 times
Been thanked: 611 times

FarNameToInputRecord / FarInputRecordToName

Post by Shmuel »

Подозреваю, что в FarInputRecordToName есть немало подобных сюрпризов. Возможный выход из этой ситуации для плагина - анализировать INPUT_RECORD самому.
User avatar
John Doe
Бюрократ
Posts: 14434
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 86 times
Been thanked: 486 times
Contact:

FarNameToInputRecord / FarInputRecordToName

Post by John Doe »

Shmuel wrote: Sat 21 Feb, 2015 13:51 в FarInputRecordToName есть немало подобных сюрпризов
В актуальных билдах большинство сюрпризов уже починено.

С Ctrl+NumLock же всё по-прежнему.
Думаю что правильным способом привести всё в соответствие - это переименовать данное сочетание в Ctrl+Pause (так например она ловится в PowerToys).

Update:
  1. Всё же есть возможность различить, какой клавише соответствует VK_PAUSE
    • с Ctrl сочетается только Ctrl+NumLock, невозможно(?) получить Ctrl+Pause
    • при нажатии Ctrl+NumLock выставлен бит ENHANCED_KEY (Фар использует сейчас именно это)
  2. Только Ctrl+NumLock превращается в VK_PAUSE.
    Остальные комбинации оставляют VK_NUMLOCK: Shift+NumLock, Ctrl+Shift+NumLock, Alt+NumLock, Alt+Shift+NumLock, Ctrl+Shift+Alt+NumLock
Исходя из этих соображений, вероятно стоит оставить Ctrl+NumLock как есть, но учесть это в FarNameToInputRecord (править вероятно надо TranslateKeyToVK)
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14434
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 86 times
Been thanked: 486 times
Contact:

FarNameToInputRecord / FarInputRecordToName

Post by John Doe »

Пример клавиш, которые приходят с битом ENHANCED_KEY: RCtrl, RAlt, LWin, RWin, Apps, PrntScr, CtrlBreak (но не CtrlScrollLock), NumLock, Divide, вероятно Standby (у меня не ловится, засыпает) и все Browser, Launch, Media* (на моей клавиатуре есть только LaunchApp2, LaunchMail, BrowserHome).

В FarNameToInputRecord эти клавиши не учитываются.

В результате FarNameToInputRecord возвращает запись, в которой ControlKeyState без этого бита.


Получается например такой казус:

Code: Select all

local r=far.NameToInputRecord"RCtrl";
r.KeyDown=false;
--r.ControlKeyState = bit64.bor(r.ControlKeyState,0x100)
far.Show(far.InputRecordToName(r))
Откуда-то берётся CtrlRCtrl.
Если раскомментировать строку, исправляющую ControlKeyState, то получается ожидаемый RCtrl.
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Разработка плагинов”