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

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

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

Post by sToLp » Sat 30 Sep, 2017 21:37

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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sat 30 Sep, 2017 22:23

sToLp wrote:
Sat 30 Sep, 2017 21:37
Но, будучи, при том же условии, запущенной из макроса, far.Show(mf.waitkey(),mf.waitkey(1)) выдаёт нам только вторую часть нажатого шорката:
Естественно, ведь первую часть "съедает" вызов макроса, он же у вас на Shift.

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sat 30 Sep, 2017 23:10

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
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sat 30 Sep, 2017 23:32


User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sun 01 Oct, 2017 05:18

John Doe wrote:
Sat 30 Sep, 2017 23:32
Вот так viewtopic.php?p=146023#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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sun 01 Oct, 2017 08:26

Из клавиш макроса надо убрать Shift

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sun 01 Oct, 2017 09:40

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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sun 01 Oct, 2017 11:03

sToLp wrote:
Sun 01 Oct, 2017 09:40
Увы, нет. Тогда тот макрос не будет работать.
Чтобы надёжно работало надо исключить или Shift (например Num7) или NumPad (например ShiftSpace).

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

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sun 01 Oct, 2017 12:29

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

А единственный надёжный способ это не назначать этот диагностический макрос на Shift<NumPad>, и перед запросом клавиши погасить NumLock (ваша собственная идея).
Текст макроса уже приведён в соответствующей теме viewtopic.php?p=145975#p145975.

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sun 01 Oct, 2017 13:52

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:29
P.S.
Напоминаю, что эта эвристика основана на недокументированных особенностях, зависящих от версии Windows.
Нет гарантии, что с очередным обновлением Windows ничего не поломается (в частности в Windows XP всё иначе).
Благодарю Вас за предупреждение! Но что будет с новыми версиями Windows одному Microsoft`у известно. А XP в нашей, например, "фирме" уже нет ни одной.

John Doe wrote:
Sun 01 Oct, 2017 12:29
А единственный надёжный способ это не назначать этот диагностический макрос на Shift<NumPad>, и перед запросом клавиши погасить NumLock (ваша собственная идея).
Текст макроса уже приведён в соответствующей теме viewtopic.php?p=145975#p145975.
Большое спасибо! Как только вполне завершу с этой темой (по ней у меня остались ещё два не до конца исследованных момента) и выпадет относительно свободное время, продолжу и с той темой.

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sun 01 Oct, 2017 16:59

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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Sun 01 Oct, 2017 17:16

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.
Напоминаю, что обсуждали ещё один вариант: viewtopic.php?p=145934#p145934

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Mon 02 Oct, 2017 15:08

John Doe wrote:
Sun 01 Oct, 2017 17:16
Напоминаю, что обсуждали ещё один вариант: viewtopic.php?p=145934#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: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 100 times

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

Post by John Doe » Mon 02 Oct, 2017 19:31

Клавиши без Shift ведут себя ожидаемым образом, что не удивительно

User avatar
sToLp
Posts: 763
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 56 times
Been thanked: 5 times

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

Post by sToLp » Sun 08 Oct, 2017 21:07

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.

Post Reply

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