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

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

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

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

Исправлено:

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

17 Comments

  1. tormozit

    Клево, а как ее использовать то?

    Reply
  2. MRAK

    Регистрируем через regsvr32, кидаем на форму… Юзаем событие KeyUp

    Reply
  3. MRAK

    Повторюсь, что контрол сырой, написал его вместе с тестированием минут за 30… если что-то надо, то доработаю…. еЕще фокус с него можно сбить только открыв модальное окно вроде бы. вообще сделан чисто для того, чтобы нормально работать в рознице с интерфейсом кассира… кто юзал типовую УТ, тот поймет… жмет пользователь на любую кнопку — срабатывает контекстный поиск — сканер в ауте… и другие мелкие косяки…

    Reply
  4. serg1c

    А действительно, как использовать?

    Хотя бы кратенькое описание команд или уж демку какую…

    Reply
  5. MRAK

    Хорошо, щас выложу обработку с этим элементом

    Reply
  6. tormozit

    Ни один другой контрол фокус не получает. Так и задумано?

    Reply
  7. MRAK

    (6) да, так задумано, дабы всегда можно было бы программно обрабатывать фокус. закончу тестирование у заказчика — выложу рабочую обработку интерфейса кассира. Если действительно необходимо программно обрабатывать потерю фокуса, то могу добавить свойство типа включить/отключить принудительный возврат фокуса.

    Reply
  8. MRAK

    (7) + блин… программно обрабатывать не фокус, а события с клавы…

    Reply
  9. Mitay

    вопрос: а можно как-то организовать обработку комбинаций клавиш? например, чтобы для «shift»+»=» выдавал «+», а не коды «шифт» и «=» по отдельности?

    То есть обрабатывать ситуацию, когда у shift признак нажата (но не отпущена) и после этого нажата и отпущена «=». Кнопки взяты для примера.

    Тогда обработка будет универсальной и сможет различать и знаки препинания и комбинации клавишь и строчные/заглавные буквы.

    Reply
  10. Mitay

    Хотя уже сам разобрался:

    параметр Shift имеет 4 значения: 0 ничего, 1 — нажат shift, 2 — нажат ctrl, 3- ???, 4 — нажат alt.

    то есть комбинации обрабатывать можно.

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

    Reply
  11. Mitay

    Еще момен: обработка прекращается, если нажат «Tab» (похоже фокус всетаки теряется). выход — перезапуск обработки, но для места кассира — это плохо, ваш заказчик может оказаться недоволен.

    Reply
  12. Mitay

    Можно ли всетаки добавить определение раскладки

    это поможет:

    Declare Function GetKeyboardLayoutName Lib «user32» Alias «GetKeyboardLayoutNameA» (ByVal pwszKLID As String) As Long

    Reply
  13. MRAK

    (11) ForeverGotFocus в TRUE должно помочь.

    (12) раскладку пока не просили, посмотрю на днях. как раз только собираюсь запускать.

    Reply
  14. Mitay

    Замечен еще момент:

    при открытии epf перехватчик успевает обработать кнопку, нажатую до открытия.

    Еще это проявляется так: если открыть два отчета, содержащие перехватчик, то если в первом нажать Esc, то он закроется, а второй скажет, что нажата кнопка 27. То есть опять же идет подхват последней кнопки нажатой в другом месте.

    Reply
  15. Mitay

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

    Reply
  16. MRAK

    (14),(15) точно, есть такой косяк… можно вруную обрабатывать событие потери фокуса (LostFocus), но не удобно… в ближайшее время внесу исправления. пока другим проектом занимался

    Reply
  17. MRAK

    доработка давно прекращения, концепция изменилась)))

    юзайте

    http://www.infostart.ru/projects/1737/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *