Комбинация клавиш 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 проблем нет.
FarNameToInputRecord / FarInputRecordToName
- HaRT
- Moderator
- Posts: 11370
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 260 times
- Been thanked: 407 times
FarNameToInputRecord / FarInputRecordToName
Если кто-то будет это менять, то прошу заметить, что на USB-клавиатуре всё несколько иначе и в чём-то даже сложнее.
Вот что пишет
(Если что, у меня клавиатура марки Genius от KYE Systems.)
Вот что пишет
[i]KeySpy2.exe[/i] из комплекта старого доброго Keyboard Maniac:(Если что, у меня клавиатура марки Genius от KYE Systems.)
Фар есть инструмент, а не нянька. © 2009 DrKnS
- 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
У меня USB клавиатура, и что это меняет в плане виртуальных клавиш?
- HaRT
- Moderator
- Posts: 11370
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 260 times
- Been thanked: 407 times
FarNameToInputRecord / FarInputRecordToName
Понятия не имею.
Я же не знаю, на каком уровне Фар работает с событиями ввода.
Фар есть инструмент, а не нянька. © 2009 DrKnS
- 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
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
Подозреваю, что в FarInputRecordToName есть немало подобных сюрпризов. Возможный выход из этой ситуации для плагина - анализировать INPUT_RECORD самому.
- 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
В актуальных билдах большинство сюрпризов уже починено.
С Ctrl+NumLock же всё по-прежнему.
Думаю что правильным способом привести всё в соответствие - это переименовать данное сочетание в Ctrl+Pause (так например она ловится в PowerToys).
Update:
- Всё же есть возможность различить, какой клавише соответствует VK_PAUSE
- с Ctrl сочетается только Ctrl+NumLock, невозможно(?) получить Ctrl+Pause
- при нажатии Ctrl+NumLock выставлен бит ENHANCED_KEY (Фар использует сейчас именно это)
- Только Ctrl+NumLock превращается в VK_PAUSE.
Остальные комбинации оставляют VK_NUMLOCK: Shift+NumLock, Ctrl+Shift+NumLock, Alt+NumLock, Alt+Shift+NumLock, Ctrl+Shift+Alt+NumLock
https://t.me/FarManager — Telegram чат
- 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
Пример клавиш, которые приходят с битом ENHANCED_KEY: RCtrl, RAlt, LWin, RWin, Apps, PrntScr, CtrlBreak (но не CtrlScrollLock), NumLock, Divide, вероятно Standby (у меня не ловится, засыпает) и все Browser, Launch, Media* (на моей клавиатуре есть только LaunchApp2, LaunchMail, BrowserHome).
В FarNameToInputRecord эти клавиши не учитываются.
В результате FarNameToInputRecord возвращает запись, в которой ControlKeyState без этого бита.
Получается например такой казус:
Откуда-то берётся
Если раскомментировать строку, исправляющую ControlKeyState, то получается ожидаемый
В 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 чат