Об опознавании клавиш-цифр нампада командой 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 »

Latest post of the previous page:

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

1) Когда, при включённом NumLock, команда lua: far.Show(mf.waitkey(),mf.waitkey(1)) запускается из комстроки, то на выходе мы получаем нажатый шорткат, разделённый на два аргумента. Например:

Code: Select all

1│ Shift
2│ Num7
2 arguments
Но, будучи, при том же условии, запущенной из макроса, far.Show(mf.waitkey(),mf.waitkey(1)) выдаёт нам только вторую часть нажатого шорката:

Code: Select all

1│ Num7
2│
2 arguments
На всякий случай привожу здесь полный текст простого тестового макроса:

Code: Select all

Macro { area="Shell"; 
key="Shift ShiftNum7"; -- если первый Shift из поля убрать, то макрос не запустится
action=function()
  far.Show(mf.waitkey(),mf.waitkey(1))
end;}
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: Sat 30 Sep, 2017 21:37Но, будучи, при том же условии, запущенной из макроса, far.Show(mf.waitkey(),mf.waitkey(1)) выдаёт нам только вторую часть нажатого шорката:
Естественно, ведь первую часть "съедает" вызов макроса, он же у вас на 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: Sat 30 Sep, 2017 22:23
sToLp wrote: Sat 30 Sep, 2017 21:37Но, будучи, при том же условии, запущенной из макроса, far.Show(mf.waitkey(),mf.waitkey(1)) выдаёт нам только вторую часть нажатого шорката:
Естественно, ведь первую часть "съедает" вызов макроса, он же у вас на Shift.
Однако, если Shift из перечня ключей запуска макроса (поля 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 30 Sep, 2017 23:32Вот так http://forum.farmanager.com/viewtopic.p ... 23#p146023
Т.е. Вы напоминаете мне об одном из ранее опубликованных макросов:
John Doe wrote: Thu 28 Sep, 2017 20:07 Механизм простой: при включенном NumLock первым приходит отдельно модификатор, а потом уже нажатая клавиша.

Code: Select all

Macro {
  area="Shell"; key="/(Shift)|(ShiftNum[0-9])|(ShiftClear)/";
  action=function()
    local key2 = mf.waitkey(1)
    local key = a=="" and akey(1,0) or "Shift"..key2.." (NumLock)"
    far.Show(key)
  end;
}
Об этом макросе я прекрасно помню, поскольку изучал его с большим интересом. Так как он является очень полезным примером того, как макросом показать фактически инициировавший его шорткат. И, вместе с тем, примером впечатляющей лаконичности.

Однако на данный момент теперь уже я акцентирую Ваше внимание не на фактически решённой задаче "как макросом показать шорткат, который нажали". Речь идёт о другой проблеме. А именно о том, как макросом показать то, что "первым приходит отдельно модификатор, а потом уже нажатая клавиша".

Выше я воспроизвёл Ваш пример того, что из комстроки это сделать вполне можно. И далее показал, что из макроса та же самая функция даёт не полный результат. И поставил вопрос как сделать его полным? Извините, что свой новый вопрос я изложил недостаточно понятно. Теперь вот пытаюсь исправить эту свою оплошность.
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 »

Из клавиш макроса надо убрать 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 01 Oct, 2017 08:26Из клавиш макроса надо убрать Shift
Увы, нет. Тогда тот макрос не будет работать.

Но, кажется, я всё же догадался как можно макросом показать то, что первым(и) приход(ит/ят) отдельно модификатор(ы), а потом уже нажатая клавиша:

Code: Select all

Macro { area="Shell"; key="CtrlAltN"; id="F1100E7A-C473-45CD-A88B-CCCDF8031CBA";

description="tes&t демонстрация того, что при включенном NumLock первыми приходят отдельно модификаторы Shift[Ctrl][Alt], а потом уже нажатая клавиша NumPad`а (sToLp)  CtrlAltN";

action=function() mf.flock(NumLock,1) -- подстрахуем включённость NumLock`а

far.Message("\nЧтобы убедиться в том,\nчто при включенном NumLock\nпервыми приходят отдельно модификаторы Shift[Ctrl][Alt],\nа потом уже нажатая клавиша NumPad`а,\nпрямо сейчас сначала нажмите Enter,\nа затем тестируемое клавишесочетание.\n\n... ","Тест ключей Shift[Ctrl][Alt]-<NumPad>:","")

Keys("l u a : f a r . S h o w ( m f . w a i t k e y ( ) , m f . w a i t k e y ( 1 ) )") exit() end; }
Несколько экзотично, но это, по крайней мере, работает.

И здесь ещё нужно уточнить, что отдельно приходят не "модификаторы и клавиша", а "модификаторы и клавиша с модификаторами без Shift`а".

Например:

Code: Select all

1│ CtrlAltShift
2│ CtrlAltNum7
 2 arguments 
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 01 Oct, 2017 09:40Увы, нет. Тогда тот макрос не будет работать.
Чтобы надёжно работало надо исключить или Shift (например Num7) или NumPad (например ShiftSpace).

Нет, можно конечно сделать, чтобы работало и с Shift<NumPad> , но не стоит всё усложнять.
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 »

P.S.
Напоминаю, что эта эвристика основана на недокументированных особенностях, зависящих от версии Windows.
Нет гарантии, что с очередным обновлением Windows ничего не поломается (в частности в Windows XP всё иначе).

А единственный надёжный способ это не назначать этот диагностический макрос на Shift<NumPad>, и перед запросом клавиши погасить NumLock (ваша собственная идея).
Текст макроса уже приведён в соответствующей теме http://forum.farmanager.com/viewtopic.p ... 75#p145975.
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 01 Oct, 2017 11:03
sToLp wrote: Sun 01 Oct, 2017 09:40Увы, нет. Тогда тот макрос не будет работать.
Чтобы надёжно работало надо исключить или Shift (например Num7) или NumPad (например ShiftSpace).
В таких то случаях, разумеется, что будет работать.

Но в этой теме рассматривается не привычный, а особый случай с NumPad`овскими клавишами-цифрами в сочетаниях с модификаторами экстравагантного поведения. Один из которых — Alt и сам по себе (независимо от состояния NumLock), и совместно с Shift`ом (при горящем NumLock) работает абсолютно особым образом. А другой — Shift, и того похлеще, при взаимодействии с NumPad`овскими цифрами при горящем NumLock от системы как бы и вовсе прячется.

И мне бы желательно не просто знать о том, как взаимодействуют эти клавиши-фокусники, а и уметь это знание правильно излагать. Так, чтобы и другому человеку было понятно о чём идёт речь и почему это именно так. И поэтому для полноты картины ещё очень желательно иметь навык правильно производить манипуляции с NumPad`овскими клавишами-цифрами и быть в состоянии эти действия более-менее грамотно воспроизводить макросами. И я Вам очень благодарен за то, что Вы мне во всём этом эффективно содействуете.


John Doe wrote: Sun 01 Oct, 2017 11:03Нет, можно конечно сделать, чтобы работало и с Shift<NumPad> , но не стоит всё усложнять.
Просто превосходно!

Что же касается некоторого усложнения макроса, то, на мой взгляд, оно в данном случае вовсе не искусственное, а вполне соответствующее случаю. И как раз облегчающее иллюстрирование сложного и даже можно сказать запутанного случая. При том, что код этого макроса получился у Вас, по-моему, как раз весьма лаконичным.

John Doe wrote: Sun 01 Oct, 2017 12:29P.S.
Напоминаю, что эта эвристика основана на недокументированных особенностях, зависящих от версии Windows.
Нет гарантии, что с очередным обновлением Windows ничего не поломается (в частности в Windows XP всё иначе).
Благодарю Вас за предупреждение! Но что будет с новыми версиями Windows одному Microsoft`у известно. А XP в нашей, например, "фирме" уже нет ни одной.

John Doe wrote: Sun 01 Oct, 2017 12:29А единственный надёжный способ это не назначать этот диагностический макрос на Shift<NumPad>, и перед запросом клавиши погасить NumLock (ваша собственная идея).
Текст макроса уже приведён в соответствующей теме http://forum.farmanager.com/viewtopic.p ... 75#p145975.
Большое спасибо! Как только вполне завершу с этой темой (по ней у меня остались ещё два не до конца исследованных момента) и выпадет относительно свободное время, продолжу и с той темой.
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 »

sToLp wrote: Sat 30 Sep, 2017 21:37А о тех результатах данных опытов, которые представляются мне достоверными, изложу здесь далее. Предположительно, тремя частями.
Однако оба неясных для меня до сегодняшнего дня момента благополучно прояснились. Один — как правильно инициировать макросы с Shift-<NumPad>-ключами и другой — о перспективах применения в этих макросах функции akey(). Причём оба эти вопроса сошлись в одном примере. Поэтому завершающей будет вторая часть изложения результатов опытов с этими ключами. Как я их на текущий момент понимаю.

2) "Макросы Shift-<NumPad>" — так для удобства далее здесь буду обозначать макросы, назначаемые на шорткаты, состоящие из клавиш-цифр NumPad`а и модификаторов, в составе которых модификатор Shift.

Опыты показали, что в поле key (т.е. в перечень ключей, запускающих макрос) данных макросов можно дополнительно включать соответствующие "голые" модификаторы (Shift, CtrlShift, AltShift, CtrlAltShift). И тогда данные Shift-<NumPad>-макросы активируются ключами [Ctrl][Alt]ShiftNum#, которыми, казалось бы, они и без дополнений должны были бы активироваться. Но если в поле key оставить только [Ctrl][Alt]ShiftNum#, то эти макросы не запускаются.

Но это дополнительное включение Shift`а приводит к тому большому неудобству, что при наличии других макросов, назначенных на данные "голые" модификаторы, нажатие на них вызывает вывод меню выбора макросов, которые в данном случае фактически-то не имеют отношения к макросам Shift-<NumPad>. Поэтому в таком случае желательно этот дополнительный Shift как ни будь нейтрализовать.

И экспериментально выяснено, что нейтрализовать дополнительные включения Shift, CtrlShift, AltShift и CtrlAltShift в поле key макросов Shift-<NumPad> вроде бы можно с помощью condition подобного следующему.

Code: Select all

condition=function()
  local key1=mf.waitkey() 
  return key1~="Shift" -- исключить голый Shift из ключей, вызывающих данный макрос
end;
При этом данный способ совсем не подходит для ранее приведённых четырёх тестовых макросов. Поскольку при включении в них подобного condition результат "первичного" mf.waitkey() далее в тестах проявляться перестаёт. Но в других случаях в макросах Shift-<NumPad> с дублирующим ключом-пустышкой этот condition, по-видимому, применять возможно. Но, вероятно, от таких макросов можно ожидать и разных других сюрпризов.

И поэтому будет гораздо лучше применять предложенный Вами образец составления Shift-<NumPad>-макроса, в котором поле key дополняется не чистым(и) модификатор(ом/ами), а, наоборот, <NumPad>-клавишей (одиночной или с модификаторами Ctrl, Alt или CtrlAlt) без модификатора Shift. И вот опробованный рабочий вариант такого макроса:

Code: Select all

Macro { area="Shell"; key="Num7 ShiftNum7"; 
-- если Num7 из key убрать, то при горящем NumLock макрос не запускается
action=function()
  if band(1,mf.flock(0,-1))~=0 then
    mf.msgbox("Если NumLock горит:","\nДелаем какое-то действие.",0x00010000)
  else
  -- при выключенном NumLock при нажатии Num7 эмулируем Home и завершаем макрос: 
  if mf.akey(1,0)=="Num7" then Keys("Home") exit() end
    mf.msgbox("Если NumLock погашен:","Делаем какое-то другое действие.",0x00010000)
  end end; }
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 01 Oct, 2017 16:59Но это дополнительное включение Shift`а приводит к тому большому неудобству, что при наличии других макросов, назначенных на данные "голые" модификаторы, нажатие на них вызывает вывод меню выбора макросов, которые в данном случае фактически-то не имеют отношения к макросам Shift-<NumPad>. Поэтому в таком случае желательно этот дополнительный Shift как ни будь нейтрализовать.
sToLp wrote: Sun 01 Oct, 2017 16:59И поэтому будет гораздо лучше применять предложенный Вами образец составления Shift-<NumPad>-макроса, в котором поле key дополняется не чистым(и) модификатор(ом/ами), а, наоборот, <NumPad>-клавишей (одиночной или с модификаторами Ctrl, Alt или CtrlAlt) без модификатора Shift.
Напоминаю, что обсуждали ещё один вариант: http://forum.farmanager.com/viewtopic.p ... 34#p145934
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 01 Oct, 2017 17:16Напоминаю, что обсуждали ещё один вариант: http://forum.farmanager.com/viewtopic.p ... 34#p145934
Спасибо за напоминание про одиночные клавиши NumPad`а (т.е. без модификаторов).

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

Каждая из клавиш NumPad`а вызывает меню выбора макросов, в заголовке которого она обозначена соответствующим образом (совпадающим с результатами выполнения команды lua:far.Show(mf.waitkey()) из комстроки), а исполнение назначенного на клавишу макроса вызывает соответствующую ей штатную команду. Результаты существенно различаются в зависимости от состояния NumLock.

При погашенном NumLock:

Клавиша: Обозначена: Действие:
Num1 Num1 End
Num2 Num2 Down
Num3 Num3 PgDn
Num4 Num4 Left
Num5 Clear "Просмотр файла", на папке – "Вычислить и показать размеры выбранных папок"
Num6 Num6 Right
Num7 Num7 Home
Num8 Num8 Up
Num9 Num9 PgUp
Num0 Num0 Ins
/ Divide Divide выводит в комстроку прямой слеш "/"
* Multiply Multiply исполняет команду "Инвертировать пометку"
- Subtract Subtract вызывает меню "Снять" штатной команды "Снять пометку с группы"
+ Add Add вызывает меню "Пометить" штатной команды "Пометить группу"
. (точка) NumDel NumDel ключ не задействован внутренней командой Far`а
NumEnter NumEnter исполняет ассоциацию, назначенную на Enter для объекта под курсором

При горящем NumLock:

Клавиша Обозначена Действие
Num1 1 выводит в комстроку цифру 1
Num2 2 выводит в комстроку цифру 2
Num3 3 выводит в комстроку цифру 3
Num4 4 выводит в комстроку цифру 4
Num5 5 выводит в комстроку цифру 5
Num6 6 выводит в комстроку цифру 6
Num7 7 выводит в комстроку цифру 7
Num8 8 выводит в комстроку цифру 8
Num9 9 выводит в комстроку цифру 9
Num0 0 выводит в комстроку цифру 0
/ Divide Divide выводит в комстроку прямой слеш "/";
* Multiply Multiply исполняет команду "Инвертировать пометку";
- Subtract Subtract меню "Снять" штатной команды "Снять пометку с группы";
+ Add Add меню "Пометить" штатной команды "Пометить группу";
. (точка) NumDel Decimal выводит в комстроку . (точку)
NumEnter NumEnter исполняет ассоциацию, назначенную на Enter для объекта под курсором
Last edited by sToLp on Mon 02 Oct, 2017 22:15, edited 1 time 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 »

Клавиши без 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: Mon 02 Oct, 2017 19:31 Клавиши без Shift ведут себя ожидаемым образом, что не удивительно
А я наконец-то разобрался в Вашем , который обеспечивает одинаковую работу модификаторов Shift CtrlShift CtrlAltShift с клавишами NumPad`а независимо от того включен ли NumLock. И теперь данный макрос нахожу необходимым.

Сначала я круто затормозил с этим макросом, поскольку воспринимал его как сугубо самостного, самого по себе, без связи с другими. Но теперь начинаю осознавать его значимость и с пользой осваивать его.

Как это было ранее выяснено, при включенном NumLock`е комбинации Shift+NumX, в т.ч. с Ctrl и с CtrlAlt, продуцируют сначала Shift, а потом уже основную клавишу. Именно этот случай и призван отлавливать данный макрос, после чего перевызывать макрос, нужный пользователю. Таким образом нампадовские макросы с Shift`ом, с CtrlShift`ом и с CtrlAltShift`ом при его наличии будут работать независимо от состояния NumLock`а. А это существенно удобнее.
Last edited by sToLp on Sun 08 Oct, 2017 21:49, 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 »

Подводя итоги.










В качестве бонусов в теме можно почерпнуть несколько полезных макросов, в т.ч. следующие:

Макрос (под спойлером), показывающий, что при включённом NumLock первым(и) приход(ит/ят) отдельно модификатор(ы), а потом уже нажатая клавиша (автор John Doe).

Макрос, обеспечивающий одинаковую работу клавиш Shift+[Ctrl[Alt]]<NumPad> независимо от того включён ли NumLock (автор John Doe). При включенном NumLock комбинации Shift+NumX, в т.ч. с Ctrl и с CtrlAlt, продуцируют сначала Shift, а потом уже основную клавишу, и данный макрос отлавливает это, и перевызывает макрос, нужный пользователю. Таким образом нампадовские макросы с Shift`ом, с CtrlShift`ом и с CtrlAltShift`ом при его наличии будут работать независимо от состояния NumLock`а.
Last edited by sToLp on Sat 21 Oct, 2017 07:37, edited 1 time in total.
Post Reply

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