Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор терминала типа VT52 (http://zx-pk.ru/showthread.php?t=20092)

Titus 31st December 2012 21:40

Quote:

Originally Posted by Patron (Post 563409)
Функция возвращает матрицу виртуальных клавиш текщего потока, которая по умолчанию совпадает с матрицей виртуальных кавиш Windows

Понятно, значит не отслеживает. Директинпут настраивается, чтобы реагировать на клавиши только при активном окне. Ну это поправимо.

Patron 31st December 2012 21:41

Quote:

Originally Posted by Titus (Post 563401)
Точно в 15? Массив-то байтовый.

Пардон, это я спутал с GetKeyState.

Что в байтовой матрице происходит - надо смотреть.

Titus 31st December 2012 21:42

Quote:

Originally Posted by Patron (Post 563409)
Список виртуальных клавиш Windows выглядит так Virtual-Key Codes, есть ли там флаг, позволяющий отличить PadEnter - не знаю. Можно написать тест, который будет после каждого нажатия клавиши сравнивать матрицу с предыдущей и показывать отличия. Если у PadEnter нет своего флага - можно научить глобальный хук писать флаг состояния PadEnter в отдельную переменную или в ту же матрицу виртуальных клавиш ( там есть свободные ячейки )

В этом списке что-то не нашел. Да и на форуме уже проскакивала тема, что нельзя отличить эти два энтера.

---------- Post added at 20:42 ---------- Previous post was at 20:41 ----------

А как узнать в глобальном хуке состояние PadEnter? Или у него еще свои коды виртуальных клавиш?

Patron 31st December 2012 21:52

Quote:

Originally Posted by Titus (Post 563415)
А как узнать в глобальном хуке состояние PadEnter?

Если эта клавиша при нажатии генерит автоповтор - то когда бы ни был подключен глобальный хук - он состояние этой клавиши тут же "подцепит".

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

Формат аргументов глобального хука описан здесь: GlobalKeyboardHook.

Titus 31st December 2012 22:06

Quote:

Originally Posted by Patron (Post 563419)
Если эта клавиша при нажатии генерит автоповтор - то когда бы ни был подключен глобальный хук - он состояние этой клавиши тут же "подцепит".

Я имею ввиду, как хук позволяет отличить основной Enter от нупадовского? У него есть разные коды для этих клавиш?

Patron 31st December 2012 22:22

1 Attachment(s)
Quote:

Originally Posted by Titus (Post 563425)
Я имею ввиду, как хук позволяет отличить основной Enter от нупадовского? У него есть разные коды для этих клавиш?

В приложении продвинутая версия хук-теста.

Вот, что она пишет в лог при нажатии и отжатии сначала обычного, а потом дополнительного Enter:

Code:

wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x0]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x80]
wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x1]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x81]

Отличие есть - это флаг доп. клавиатуры в наборе флагов.

...

Titus 31st December 2012 22:33

Quote:

Originally Posted by Patron (Post 563433)
Отличие есть - это флаг доп. клавиатуры в наборе флагов.

Только что сделал тест для сравнения виртуальных кодов клавиш через GetKeyboardState(). В ней, к сожалению, нажатия разных энтеров ТОЧНО не различаются.

Опять, получается, костыли всякие.

---------- Post added at 21:33 ---------- Previous post was at 21:30 ----------

Quote:

Originally Posted by Patron (Post 563433)
Вот, что она пишет в лог при нажатии и отжатии сначала обычного, а потом дополнительного Enter:

Code:

wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x0]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x80]
wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x1]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x81]

Отличие есть - это флаг доп. клавиатуры в наборе флагов.

...

Все правильно, и в доке так сказано:

Quote:

0 Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.

Patron 31st December 2012 22:34

Quote:

Originally Posted by Titus (Post 563440)
Опять, получается, костыли всякие.

DirectInput - те же самые костыли, только написанные в Микрософте.

Titus 31st December 2012 22:39

Quote:

Originally Posted by Patron (Post 563443)
DirectInput - те же самые костыли, только написанные в Микрософте.

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

Ну, допустим, сделать перехват клавиши дополнительного энтера в хуке. Куда потом его сувать? Придумывать новый сканкод? Это будет самодеятельность, т.к. эти же сканкоды получают другие приложения.

Так же всегда есть задержка между включеним и отключением глобального хука по активизации окна.

Можно, конечно, засинхронизироваться, но это все усложненно.

Patron 31st December 2012 23:08

Quote:

Originally Posted by Titus (Post 563445)
Куда потом его сувать?

Можно вести полностью свою матрицу всех клавиш - в удобном для себя формате.

Quote:

Так же всегда есть задержка между включеним и отключением глобального хука по активизации окна.
Хук можно включать один раз - при запуске программы. При получении фокуса устанавливать флажок для хука, а при потере - убирать. А уже хук, глядя на этот флажок - будет пропускать или не пропускать нажатие NumLock в Windows.

Чтобы не пустить нажатие в Windows - хук должен сделать return 1;,
а чтобы пропустить - return CallNextHookEx( ghKeyboardHook, nCode, wp, lp );


Кстати - у меня в хук-тесте ошибка, там в CallNextHookEx передаются не оригинальные параметры вызова ( wp и lp ), а переработанные ( wParam и lParam ) - а надо передавать точно те, которые получены хуком.


All times are GMT +4. The time now is 02:41.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.