Honeywell Dolphin 9500 (Pocket PC 2003) конфликты обработки событий C#?
Окружающая среда
- Windows XP x32 Visual Studio 2005 Standard Edition
- Honeywell Dolphin 9500 под управлением Windows Mobile 2003 (Pocket PC 2003)
- со встроенным сканером штрих-кодов и камерой B&W
- используя их SDK, расположенный здесь.
- .NET Compact Framework 1.0 SP3 и .NET Framework 1.1
- Использование VC#
Цель
Я пытаюсь создать приложение, которое позволяет человеку сканировать штрих-код а затем сделайте снимок. Эти вещи не должны происходить одновременно. Пользователь должен иметь возможность дважды проверить сканирование штрих-кода, а затем перейти к той части приложения, которая обрабатывает Захват изображений.
Задача
номера строк ссылаются на мой код в ссылкеfriendpaste в разделе кода ниже.
У меня есть два обработчика событий: один для декодирования события из элемента управления сканером штрих-кодов, а другой для вызова изображения захват управления с помощью события KeyDown. Элемент управления decode имеет свой собственный обработчик событий DecodeEventHandler и набор триггерных Ключей с перечислением (lns 201 и 202). Однако управление изображением этого не делает. В его документации говорится, что форма должна иметь обработчик событий KeyDown (ln 120) и перечисление ключей триггера (ln 178). При запуске приложения (без обработчика событий SelectedIndexChanged [ln 76]) сканер штрих-кодов работает отлично, но переключается на вкладку (или форму, как у меня пробовал отдельные формы, а также), с контролем захвата изображения и нажатием кнопки запуска на устройстве (сканирование в этом случае) заставляет КПК действовать так, как будто он все еще сканирует штрих-код (загорается красный свет, появляется зеленый свет прицела, пищит, когда сталкивается со штрих-кодом) вместо поведения, обычно отображаемого при использовании элемента управления изображением (нет света или белого света, как вспышка).
Вещи, которые я пробовал
- важно: Если я удалю управление декодированием из приложение, управление изображением работает. Если я создаю отдельное приложение с одним только элементом управления изображением,оно работает.
- я поставил точку останова в строке 210 и обнаружил, что событие KeyDown никогда не попадает. На этом этапе я попытался каким-то образом разделить обработчики событий или элементы управления, поэтому я ввел обработчик событий SelectedIndexChanged для моего элемента управления tab и после переключения на вкладку с соответствующим элементом управления я попытался удалить обработчики событий. Мне удалось удалить DecodeEvent обработчик, но все еще не смог попасть в делегат обработчика событий KeyDown, который я написал.
- как декодирование, так и управление изображениями из пакета Honeywell SDK имеют события "Disconnect", которые (цитируя документацию) "отключаются от модуля сканирования". Поэтому я попытался отсоединить и повторно подключить элементы управления, основываясь на том, на какую вкладку я переключался, но и в этом мне не удалось. Я также где-то читал, что события формы иногда могут быть нарушены, если форма теряет фокус. Поэтому я осуществил следующее: Форма.LostControl событие / обработчик и поставить в этом.Focus (), чтобы вернуть фокус в форму, но безрезультатно.
- я столкнулся с несколькими людьми, предлагающими KeyPreview = true и обработку / делегирование событий на уровне формы. Похоже, что .NET Compact Framework версии 1 не реализует это, поскольку объекты my Form не имеют элемента KeyPreview.
- Внутри перечисления триггерной клавиши (пример в строке 202) есть перечисление для клавиши Enter на устройстве. Я попытался подключить это к изображению управление и сканирование до управления декодером, но все еще не смог попасть в событие KeyDown.
Код
Http://friendpaste.com/355cQOCghvPkE5YR29lthO
Я разместил код как ссылку на friendpaste, потому что он несколько длинноват (~230 строк). Дайте мне знать, если я просто включу его сюда.
Нужна дополнительная информация?
Спрашивайте, и я сделаю все, что в моих силах!Я бы пометил этот Honeywell Dolphin 9500, но я новый пользователь.
3 ответа:
Причина, по которой я думаю, что вы не можете добраться до обработчика
KeyDown
, заключается в том, что тот, который предназначен дляTabControl1_IndexChanged
, являетсяSystem.EventHandler
, который является общей формойKeyDown
.Попробуйте сделать что-то подобное и посмотрите, ловит ли он
KeyDown
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { if (sender is Form1 && e is KeyEventArgs) { Form1_KeyDown(sender, (KeyEventArgs) e); } else { //Do other stuff } }
Это немного халтура, но я думаю, что это сработает. Set
AllKeys( true );
. Это должно гарантировать, что ваше приложение фиксирует любое нажатие клавиатуры.AllKeys P / Invoke signature: http://blogs.msdn.com/b/mikefrancis/archive/2009/03/28/porting-gapi-keys-to-wm-6-1-and-6-5.aspx
Общая информация по всем ключам: http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2009/07/14/just-say-no-to-gapi-what-you-need-to-know-about-allkeys-and-input-management.aspx
Похоже, что управление декодированием проглатывает нужное вам сообщение. Вы можете попробовать связаться со службой поддержки разработчиков HHP. Если у них есть онлайн-форум поддержки разработчиков, который тоже может работать. В качестве теста, Что произойдет, если вы начнете комментировать строки 192-202? Вызывает ли одна из этих строк остановку события keydown работает?
- Поль
Edit
ImageControl и decodeControl принимают параметр
TriggerKey
. Это звучит так, как будто они ожидают, что будут сами обрабатывать события нажатия клавиш.Попробуйте следующее: В зависимости от того, на какой вкладке вы находитесь, за один раз создавайте только один экземпляр. Избавьтесь от кода обработки
Form1_KeyDown
все вместе (включая AllKeys). Посмотрим, сработает ли это.Поочередно, вы все еще можете убить своего обработчика
Form1_KeyDown
, но держите оба элемента управления просто как они и делают это в вашемtabControl1_SelectedIndexChanged
обработчике вместо:Теперь только один из них будет следить за кнопкой сканирования в зависимости от того, на какой вкладке вы находитесь.private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { if (this.tabControl1.SelectedIndex == 0) { this.decodeControl1.TriggerKey = HHP.DataCollection.Common.TriggerKeyEnum.TK_ONSCAN; this.imageControl1.TriggerKey = null; } else if (this.tabControl1.SelectedIndex == 1) { this.decodeControl1.TriggerKey = null; this.imageControl1.TriggerKey = TriggerKeyEnum.TK_ONSCAN; } }
Я обнаружил, что если я изменю TriggerKey на TK_ENTER (другое значение в перечислении triggerkey), я могу взаимодействовать с элементом управления изображением без каких-либо проблем. Теперь мне просто нужно найти способ захватить это нажатие клавиши Enter, чтобы он не делал ничего странного.
Спасибо за помощь!