Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Здесь обсуждается всё, что касается макросов.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

Нажатые сами по себе клавиши-цифры нампада при включённом NumLock опознаются как цифры, а при выключенном — согласно другим обозначениям на этих клавишах (Home, End, PgUp, PgDn, Ins, Del, Up, Down, Left, Right), клавиша Num5 опознаётся как Clear.

Раздвоение нажатий нампадовских клавиш несколько напрягает. И поэтому то, что, вне зависимости от включения NumLock, их нажатия в сочетаниях с модификатором Ctrl опознаются однообразно как CtrlNumЦифра (CtrlNum5 — как CtrlClear) воспринимается сугубо положительно. Аналогично и с сочетаниями с CtrlAlt. И также ожидается, что и в других сочетаниях с модификаторами (за исключением особых комбинаций с Alt) будет подобная ситуация. Однако, в других случаях наблюдается следующее.

Шорткаты ShiftNumЦифра, CtrlShiftNumЦифра, AltShiftNumЦифра и CtrlAltShiftNumЦифра при включённом NumLock опознаются как сочетания только соответствующих модификаторов Shift, CtrlShift, AltShift и CtrlAltShift без цифр. А вот при выключенном NumLock — нормально, как модификатор(ы)+NumЦифра (в случаях с Num5 — как модификатор(ы)+Clear).

ОС — Win10 LTSB x64 рус; Far 5036 x86.
Last edited by sToLp on Sat 23 Sep, 2017 15:50, edited 1 time in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Об опознавании клавиш-цифр нампада командой mf.key(mf.waitkey(0,1)).

Post by DrKnS »

Это фича Windows, пользуйтесь поиском.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.key(mf.waitkey(0,1)).

Post by John Doe »

P. S.
А mf.key зачем?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

John Doe wrote: Sat 23 Sep, 2017 15:29А mf.key зачем?
Спасибо за внимательность! Поправил.
DrKnS wrote: Sat 23 Sep, 2017 14:26Это фича Windows, пользуйтесь поиском.
Кажется, нашёл: The shift key overrides NumLock. Машинный перевод:
Возможно, это не так хорошо известно сегодня, как это было во времена, когда клавиши со стрелками и цифровым клавиатурным разделом - это то, что клавиша сдвига переопределяет NumLock.

Если NumLock включен (как обычно), то нажатие клавиши на цифровой клавиатуре при удерживании клавиши сдвига отменяет NumLock и вместо этого генерирует клавишу со стрелкой (или другую навигационную клавишу), напечатанную мелким шрифтом под большими цифрами.

(Клавиша shift также переопределяет CapsLock. Если вы включите CapsLock, тогда удерживайте клавишу shift во время ввода буквы, эта буква появится в нижнем регистре.)

Возможно, вы могли бы решить, что эта небольшая притворная клавиша абсолютно ничтожна, по крайней мере, пока вы не попытаетесь сделать что-то вроде Shift + Numpad0 как горячую клавишу и задаться вопросом, почему она не работает. Теперь ты знаешь.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

Кажется, я чуток подзапутался. Ведь то, что Shift "переопределяет NumLock", должно вроде бы означать, что включённый NumLock он выключает, а выключенный — включает (по аналогии с тем, что он делает с CapsLock)?

И при выключенном NumLock картинка вроде бы вполне совпадает — с присутствием среди модификаторов Shift`а NumLock как бы включается. И мы закономерно имеем на выходе просто цифры, вкупе с соответствующими модификаторами.

Но тогда, казалось бы, можно было бы ожидать того, что при применении шорткатов с Shift`ом в условиях включенного NumLock`а он должен был бы как бы выключаться. И на выходе мы вроде бы должны были бы получать Home (Num7), End (Num1), PgUp (Num9), PgDn (Num3), Ins (Num0), Up (Num8), Down (Num2), Left (Num4), Right (Num6) и Clear, вкупе с соответствующими модификаторами. Это не было удобно. Но это и не были бы "пустые" модификаторы. И при желании для удобства их можно было бы переопределить макросами. Или я чего-то недопонимаю?
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by zg »

вы нажимаете shift, приходит нажатие shift, вы нажимаете num7, приходит отпускание shift и нажатие home, отпускаете home, приходит, отпускание home и нажатие shift, отпускаете shift - приходит отпускание shift. т.е. реально три нажатия shift, home, shift. вы, видимо видите только последнее.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

zg wrote: Sat 23 Sep, 2017 22:46вы нажимаете shift, приходит нажатие shift, вы нажимаете num7, приходит отпускание shift и нажатие home, отпускаете home, приходит, отпускание home и нажатие shift, отпускаете shift - приходит отпускание shift. т.е. реально три нажатия shift, home, shift. вы, видимо видите только последнее.
Благодарю Вас за обстоятельное разъяснение! И надеюсь, что я его правильно понял. Т.е в другом случае (при выключенном NumLock) картина существенно иная: нажимаю shift, приходит нажатие shift (и как бы включение NumLock), нажимаю 7, приходит отпускание shift (и как бы выключение NumLock) и вместе с тем нажатие 7, отпускаю 7, приходит 7, и я это последнее и вижу.

И тогда, поскольку команда mf.waitkey(0,1) объективно не может полноценно распознать нажатие шорткатов ShiftNumЦифра, CtrlShiftNumЦифра, AltShiftNumЦифра и CtrlAltShiftNumЦифра при включённом NumLock, нет ли другого способа сделать это?
Last edited by sToLp on Sun 24 Sep, 2017 07:12, edited 2 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe »

zg wrote: Sat 23 Sep, 2017 22:46 вы, видимо видите только последнее.
Наоборот, первое, waitkey для модификаторов ловит отпускания.

Code: Select all

lua:far.Show(mf.waitkey(),mf.waitkey(1))
Что, впрочем, сути не меняет, ведь объяснение верное.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe »

sToLp wrote: Sun 24 Sep, 2017 06:50Т.е в другом случае (при выключенном NumLock) картина существенно иная: нажимаю shift, приходит нажатие shift (и как бы включение NumLock), нажимаю 7, приходит отпускание shift (и как бы выключение NumLock) и вместе с тем нажатие 7, отпускаю 7, приходит 7, и я это последнее и вижу.
Нет, в этом случае всё проще, при выключенном NumLock клавиша называется Num7, отпускание Shift приходит именно тогда, когда вы его реально отпускаете (ОС тут не вмешивается), и waitkey возвращает ShiftNum7.

А при включенном происходит то, что описал zg. Это тоже ловится waitkey, но как два нажатия, см. мой пример.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

John Doe wrote: Sun 24 Sep, 2017 08:11Нет, в этом случае всё проще, при выключенном NumLock клавиша называется Num7...
Т.е. правильнее будет понимать это следующим образом:

При выключенном NumLock нажимаю Shift (винда это как бы игнорирует), нажимаю Num7, приходит отпускание Shift (и это отпускание интерпретируется как модификатор) и вместе с тем нажатие Num7 (что в совокупности интерпретируется как ShiftNum7), отпускаю Num7, приходит ShiftNum7, и вот это mf.waitkey(0,1) мне и выдаёт.

?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe »

Неправильно.
Всё максимально прямолинейно.
  1. Нажимаю Shift
    Приходит нажатие, но оно никак не интерпретируется фаром.
  2. Нажимаю Num7.
    Приходит Num7, который в совокупности с ControlKeyState интерпретируется фаром как ShiftNum7, который вы и получаете в waitkey.
    А если удерживать Num7, то получим автоповтор.
  3. Отпускаю Num7.
    Приходит, но никак не интерпретируется.
  4. Отпускаю Shift.
    Приходит, но никак не интерпретируется.
    Если бы между нажатием Shift и его отпусканием не было бы других событий, то интепретировалось бы фаром как одиночный Shift.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

John Doe wrote: Sun 24 Sep, 2017 09:28Всё максимально прямолинейно.
Большое спасибо за подробное объяснение! Для осознания того, почему получается именно такой результат это очень полезно.

John Doe wrote: Sun 24 Sep, 2017 08:05waitkey для модификаторов ловит отпускания

Code: Select all

lua:far.Show(mf.waitkey(),mf.waitkey(1))
И за пример большая Вам благодарность! Такие примеры очень помогают осваивать макросы.

А поскольку вопрос полноценного распознания шорткатов ShiftNumЦифра, CtrlShiftNumЦифра, AltShiftNumЦифра и CtrlAltShiftNumЦифра макросом при включённом NumLock остаётся открытым, нельзя ли поднять его на багтрекере? Спрашиваю потому, что, в вопросах программирования фактически являюсь дилетантом начального уровня, перспективу решения вопроса самостоятельно оценить не могу, и не хотел бы обременять специалистов заведомо бесперспективной просьбой.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by John Doe »

Полноценного распознавания не получится, только эвристическое.
Когда-то оно было, но от него отказались, т.к. в определённых случаях мешало.

Можно попробовать самостоятельно "вычислять" клавишу, используя дополнительную информацию от win.GetKeyState.
Возможно также, что модуль xmod поможет с этим справится, я не смотрел.

Edit
Проверил, win.GetKeyState тут не поможет
Last edited by John Doe on Sun 24 Sep, 2017 15:50, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Об опознавании клавиш-цифр нампада командой mf.waitkey(0,1).

Post by sToLp »

John Doe wrote: Sun 24 Sep, 2017 10:38Проверил, win.GetKeyState тут не поможет
Кажется, я догадался как можно при включённом NumLock макросом показать шорткаты, набиваемые нампадовскими цифрами с модификаторами, в составе которых модификатор Shift. На эту догадку меня натолкнул приведённый Вами пример с двумя ключами.

Code: Select all

lua:mf.waitkey() local res=(mf.waitkey(1)) local bnd=mf.replace(res,"Num","ShiftNum") msgbox("Правильный ключ:",bnd,0x00010000)

С ключом "Clear" аналогичная замена на "ShiftClear".

Если этот вариант допустим, то надо будет ещё правильные условия в condition подобрать.
Post Reply

Return to “Обсуждение макросов”