Перехватчик нажатий клавиш (ActiveX)

Опубликовал Роман Ершов (MRAK) в раздел Программирование - Внешние компоненты

Примитивная компонента ActiveX, перехватывающая нажатия клавиш и принудительно возвращающая фокус компоненте при его потере. Искал в свое время для внедрения в интерфейс кассира. Может, кому еще пригодится.

Примитивная компонента ActiveX, перехватывающая нажатия клавиш и принудительно возвращающая фокус компоненте при его потере. Сделал в свое время для внедрения в интерфейс кассира - чисто для того, чтобы нормально работать в рознице ... кто юзал типовую УТ, тот поймет... жмет пользователь на любую кнопку - срабатывает контекстный поиск - сканер в ауте... и другие мелкие косяки.... Может, кому еще пригодится.

В обработке показан пример использования компоненты. Не забудьте зарегить при помощи regsvr32. При открытии формы необходимо установить фокус на контрол.

Исправлено:

  • свойство Enabled обрабатывается.
  • свойство BackColor обрабатывается.
  • остальные свойства исключены из контрола
  • добавлено свойство "ForeverGotFocus". Если оно false, то обработка потери фокуса не производится средствами контрола - обрабатывайте сами событие "LostFocus"

Скачать файлы

Наименование Файл Версия Размер
версия 1.03
.1197634756 24,00Kb
25.09.09
145
.1197634756 24,00Kb 145 Бесплатно
Демонстрационная обработка
.1197965168 5,47Kb
25.09.09
125
.1197965168 5,47Kb 125 Бесплатно

См. также

Добавить вознаграждение
Комментарии
1. Сергей Старых (tormozit) 4106 14.12.07 19:56 Сейчас в теме
Клево, а как ее использовать то?
2. Роман Ершов (MRAK) 693 14.12.07 22:13 Сейчас в теме
Регистрируем через regsvr32, кидаем на форму... Юзаем событие KeyUp
3. Роман Ершов (MRAK) 693 14.12.07 22:34 Сейчас в теме
Повторюсь, что контрол сырой, написал его вместе с тестированием минут за 30... если что-то надо, то доработаю.... еЕще фокус с него можно сбить только открыв модальное окно вроде бы. вообще сделан чисто для того, чтобы нормально работать в рознице с интерфейсом кассира... кто юзал типовую УТ, тот поймет... жмет пользователь на любую кнопку - срабатывает контекстный поиск - сканер в ауте... и другие мелкие косяки...
4. Сергей Генералов (serg1c) 20 18.12.07 10:47 Сейчас в теме
А действительно, как использовать?
Хотя бы кратенькое описание команд или уж демку какую...
5. Роман Ершов (MRAK) 693 18.12.07 11:02 Сейчас в теме
Хорошо, щас выложу обработку с этим элементом
6. Сергей Старых (tormozit) 4106 18.12.07 22:51 Сейчас в теме
Ни один другой контрол фокус не получает. Так и задумано?
7. Роман Ершов (MRAK) 693 19.12.07 10:01 Сейчас в теме
(6) да, так задумано, дабы всегда можно было бы программно обрабатывать фокус. закончу тестирование у заказчика - выложу рабочую обработку интерфейса кассира. Если действительно необходимо программно обрабатывать потерю фокуса, то могу добавить свойство типа включить/отключить принудительный возврат фокуса.
8. Роман Ершов (MRAK) 693 19.12.07 10:01 Сейчас в теме
(7) + блин... программно обрабатывать не фокус, а события с клавы...
9. Дмитрий (Mitay) 16.01.08 11:14 Сейчас в теме
вопрос: а можно как-то организовать обработку комбинаций клавиш? например, чтобы для "shift"+"=" выдавал "+", а не коды "шифт" и "=" по отдельности?
То есть обрабатывать ситуацию, когда у shift признак нажата (но не отпущена) и после этого нажата и отпущена "=". Кнопки взяты для примера.
Тогда обработка будет универсальной и сможет различать и знаки препинания и комбинации клавишь и строчные/заглавные буквы.
10. Дмитрий (Mitay) 16.01.08 12:25 Сейчас в теме
Хотя уже сам разобрался:
параметр Shift имеет 4 значения: 0 ничего, 1 - нажат shift, 2 - нажат ctrl, 3- ???, 4 - нажат alt.
то есть комбинации обрабатывать можно.
вот только не хватает признака раскладки клавиатуры, чтобы знать какой символ соответствует нажатой кнопке.

11. Дмитрий (Mitay) 16.01.08 12:51 Сейчас в теме
Еще момен: обработка прекращается, если нажат "Tab" (похоже фокус всетаки теряется). выход - перезапуск обработки, но для места кассира - это плохо, ваш заказчик может оказаться недоволен.
12. Дмитрий (Mitay) 16.01.08 13:06 Сейчас в теме
Можно ли всетаки добавить определение раскладки

это поможет:
Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long

13. Роман Ершов (MRAK) 693 16.01.08 20:39 Сейчас в теме
(11) ForeverGotFocus в TRUE должно помочь.
(12) раскладку пока не просили, посмотрю на днях. как раз только собираюсь запускать.
14. Дмитрий (Mitay) 18.01.08 12:53 Сейчас в теме
Замечен еще момент:
при открытии epf перехватчик успевает обработать кнопку, нажатую до открытия.
Еще это проявляется так: если открыть два отчета, содержащие перехватчик, то если в первом нажать Esc, то он закроется, а второй скажет, что нажата кнопка 27. То есть опять же идет подхват последней кнопки нажатой в другом месте.
15. Дмитрий (Mitay) 19.01.08 17:03 Сейчас в теме
аналогичная ситуация: после закрытия модального окна кнопкой Ентер, перехватчик говорит, что сработал Ентер, хотя он был нажат в другом окне. То есть перехватчик ловит кнопку, нажатую до получения фокуса самим перехватчиком.
16. Роман Ершов (MRAK) 693 28.01.08 10:48 Сейчас в теме
(14),(15) точно, есть такой косяк... можно вруную обрабатывать событие потери фокуса (LostFocus), но не удобно... в ближайшее время внесу исправления. пока другим проектом занимался
17. Роман Ершов (MRAK) 693 17.11.08 17:24 Сейчас в теме
доработка давно прекращения, концепция изменилась)))
юзайте
http://www.infostart.ru/projects/1737/
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа