Перехватчик нажатий клавиш (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 не будет опубликован. Обязательные поля помечены *