flock() Сочетания клавиш с Caps/Num/Scroll-локами

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Сочетания клавиш с Caps/Num/Scroll-локами

Post by John Doe »

Latest post of the previous page:

Усложнение текста статьи, неудобства в использовании...

1. Предлагаю все эти биты спрятать внутри функции.
Проще всего сделать через добавочные значения Nkey:


2. NState предлагаю сделать опциональным. По умолчанию "-1" (получить состояние клавиши).

3. "Обвязку" неплохо бы пояснить немного подробнее.
Возможно ли её убрать внутрь функции?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Сочетания клавиш с Caps/Num/Scroll-локами

Post by John Doe »

John Doe wrote: 3. "Обвязку" неплохо бы пояснить немного подробнее.
Возможно ли её убрать внутрь функции?
А ответ на вопрос был чуть выше:
zg wrote: макросы не работают как ожидалось. потому как при физически нажатом капслоке программно его состояние не меняется. поэтому макросы должны быть примерно такими:
[HKEY_CURRENT_USER\Software\Far\KeyMacros\Shell\CtrlCapsLock]
"Sequence"="CtrlShiftTab %a=flock(1,-1)&1; $while((flock(1,-1)&1)==%a) sleep(50) flock(1,2) $end"
Во-первых есть (и всегда была) возможность проверить удерживается ли в данный момент клавиша: bit.band(mf.flock(key),0xff80)==0xff80
Во-вторых, изменение состояния можно произвести в отдельном потоке, не задерживая макрос (far.Timer)
Или (ещё лучше) отложить это изменение до тех пор, пока из буфера не будут прочитаны события отпускания соответствующих клавиш.
Такое сейчас можно организовать и макросом (Event { group="ConsoleInput";[...]), но будет сильно удобнее, если эта кухня будет скрыта в фаре, или в самом плагине luamacro.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Сочетания клавиш с Caps/Num/Scroll-локами

Post by John Doe »

Хотя.. судя по всему есть более простой способ: просто предварительно поместить в буфер событие отпускания.
Т.е. тут будет вот так просто:

Code: Select all

			keybd_event(vkKey, 0, ExKey | KEYEVENTF_KEYUP, 0);
			keybd_event(vkKey, 0, ExKey, 0);
			keybd_event(vkKey, 0, ExKey | KEYEVENTF_KEYUP, 0);
			
Грязный хак, но ничем не хуже чем было.

Update
Или так: 0003557: mf.flock: исправить "капризность" функции
Last edited by John Doe on Wed 22 Nov, 2017 21:42, edited 1 time in total.
Post Reply

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