Примитивная компонента ActiveX, перехватывающая нажатия клавиш и принудительно возвращающая фокус компоненте при его потере. Сделал в свое время для внедрения в интерфейс кассира — чисто для того, чтобы нормально работать в рознице … кто юзал типовую УТ, тот поймет… жмет пользователь на любую кнопку — срабатывает контекстный поиск — сканер в ауте… и другие мелкие косяки…. Может, кому еще пригодится.
В обработке показан пример использования компоненты. Не забудьте зарегить при помощи regsvr32. При открытии формы необходимо установить фокус на контрол.
Исправлено:
- свойство Enabled обрабатывается.
- свойство BackColor обрабатывается.
- остальные свойства исключены из контрола
- добавлено свойство «ForeverGotFocus». Если оно false, то обработка потери фокуса не производится средствами контрола — обрабатывайте сами событие «LostFocus»
Клево, а как ее использовать то?
Регистрируем через regsvr32, кидаем на форму… Юзаем событие KeyUp
Повторюсь, что контрол сырой, написал его вместе с тестированием минут за 30… если что-то надо, то доработаю…. еЕще фокус с него можно сбить только открыв модальное окно вроде бы. вообще сделан чисто для того, чтобы нормально работать в рознице с интерфейсом кассира… кто юзал типовую УТ, тот поймет… жмет пользователь на любую кнопку — срабатывает контекстный поиск — сканер в ауте… и другие мелкие косяки…
А действительно, как использовать?
Хотя бы кратенькое описание команд или уж демку какую…
Хорошо, щас выложу обработку с этим элементом
Ни один другой контрол фокус не получает. Так и задумано?
(6) да, так задумано, дабы всегда можно было бы программно обрабатывать фокус. закончу тестирование у заказчика — выложу рабочую обработку интерфейса кассира. Если действительно необходимо программно обрабатывать потерю фокуса, то могу добавить свойство типа включить/отключить принудительный возврат фокуса.
(7) + блин… программно обрабатывать не фокус, а события с клавы…
вопрос: а можно как-то организовать обработку комбинаций клавиш? например, чтобы для «shift»+»=» выдавал «+», а не коды «шифт» и «=» по отдельности?
То есть обрабатывать ситуацию, когда у shift признак нажата (но не отпущена) и после этого нажата и отпущена «=». Кнопки взяты для примера.
Тогда обработка будет универсальной и сможет различать и знаки препинания и комбинации клавишь и строчные/заглавные буквы.
Хотя уже сам разобрался:
параметр Shift имеет 4 значения: 0 ничего, 1 — нажат shift, 2 — нажат ctrl, 3- ???, 4 — нажат alt.
то есть комбинации обрабатывать можно.
вот только не хватает признака раскладки клавиатуры, чтобы знать какой символ соответствует нажатой кнопке.
Еще момен: обработка прекращается, если нажат «Tab» (похоже фокус всетаки теряется). выход — перезапуск обработки, но для места кассира — это плохо, ваш заказчик может оказаться недоволен.
Можно ли всетаки добавить определение раскладки
это поможет:
Declare Function GetKeyboardLayoutName Lib «user32» Alias «GetKeyboardLayoutNameA» (ByVal pwszKLID As String) As Long
(11) ForeverGotFocus в TRUE должно помочь.
(12) раскладку пока не просили, посмотрю на днях. как раз только собираюсь запускать.
Замечен еще момент:
при открытии epf перехватчик успевает обработать кнопку, нажатую до открытия.
Еще это проявляется так: если открыть два отчета, содержащие перехватчик, то если в первом нажать Esc, то он закроется, а второй скажет, что нажата кнопка 27. То есть опять же идет подхват последней кнопки нажатой в другом месте.
аналогичная ситуация: после закрытия модального окна кнопкой Ентер, перехватчик говорит, что сработал Ентер, хотя он был нажат в другом окне. То есть перехватчик ловит кнопку, нажатую до получения фокуса самим перехватчиком.
(14),(15) точно, есть такой косяк… можно вруную обрабатывать событие потери фокуса (LostFocus), но не удобно… в ближайшее время внесу исправления. пока другим проектом занимался
доработка давно прекращения, концепция изменилась)))
http://www.infostart.ru/projects/1737/
юзайте