Honeywell Dolphin 9500 (Pocket PC 2003) C# Обработка событий Конфликты?
Среда
- Windows XP x32 Visual Studio 2005 Standard Edition
- Honeywell Dolphin 9500 под управлением Windows Mobile 2003 (Pocket PC 2003)
- Со встроенным сканером штрих-кода и черно-белой камерой
- Используя их SDK, расположенный здесь.
- .NET Compact Framework 1.0 SP3 и.NET Framework 1.1
- Использование VC#
Цель
Я пытаюсь создать приложение, которое позволяет человеку сканировать штрих-код, а затем захватить изображение. Эти вещи не должны происходить одновременно. Пользователь должен иметь возможность дважды проверить сканирование штрих-кода, а затем перейти к той части приложения, которая обрабатывает захват изображения.
проблема
Номера строк ссылаются на мой код в ссылке на дружественную пасту в разделе "Код" ниже.
У меня есть два обработчика событий: один для события декодирования из элемента управления сканера штрих-кода, а другой для вызова управления захватом изображения через событие KeyDown. Элемент управления decode имеет свой собственный обработчик событий / DecodeEventHandler и ключ триггера, установленный с помощью enum (lns 201 и 202). Контроля изображения, однако, нет. В документации говорится, что форма должна иметь обработчик события KeyDown (ln 120) и перечисление ключа триггера (ln 178). После запуска приложения (без установленного обработчика событий SelectedIndexChanged [ln 76]) сканер штрих-кода работает отлично, но переключается на вкладку (или форму, как я уже пробовал в отдельных формах), с контролем захвата изображения и нажатие триггерной клавиши на устройстве (в данном случае SCAN) заставляет контроллер работать так, как будто он все еще сканирует штрих-код (загораются красные огни, горит зеленый индикатор прицеливания, гудит при обнаружении штрих-кода) вместо поведения, обычно отображаемого при использовании управление изображением (нет света или белый свет, как вспышка).
Вещи, которые я пробовал
- ВАЖНО: Если я удаляю управление декодированием из приложения, управление изображением работает. Если я создаю отдельное приложение только с контролем изображения, оно работает.
- Я установил точку останова в строке 210 и обнаружил, что событие KeyDown никогда не срабатывает. В этот момент я попытался каким-то образом отделить обработчики событий или элементы управления, поэтому я представил обработчик событий SelectedIndexChanged для своего элемента управления вкладкой и, переключившись на вкладку с соответствующим элементом управления, попытался удалить обработчики событий. Мне удалось удалить обработчик DecodeEvent, но я все еще не смог попасть в делегат обработчика событий KeyDown, который я написал.
- Оба элемента управления декодирования и изображения из SDK компании Honeywell имеют события "Отключение", которые (цитируя документацию) "Отключение от модуля сканирования". Поэтому я попытался отключить и снова подключить элементы управления, основываясь на том, на какую вкладку я переключался, но и в этом тоже не получилось.
- Я также где-то читал, что события формы могут иногда прерываться, если форма теряет фокус. Поэтому я реализовал обработчик событий / обработчик Form.LostControl и вставил this.Focus(), чтобы вернуть фокус форме, но безрезультатно.
- Я сталкивался с несколькими людьми, предлагая KeyPreview = true и обрабатывая / делегируя события на уровне формы. Похоже, что.NET Compact Framework версии 1 не реализует это, так как мои объекты Form не имеют члена KeyPreview.
- В перечислении Trigger Key (пример в строке 202) есть перечисление для клавиши Enter на устройстве. Я попытался подключить это к элементу управления изображением и отсканировать до элемента управления декодером, но все еще не смог попасть в событие KeyDown.
Код
http://friendpaste.com/355cQOCghvPkE5YR29lthO
Я разместил код в виде ссылки на дружественную пасту, потому что она несколько длинная (~230 строк). Дайте мне знать, если я просто включу это здесь.
Нужна дополнительная информация?
Спросите, и я сделаю все возможное!
Я бы пометил этот Honeywell Dolphin 9500, но я новый пользователь.
3 ответа
Я обнаружил, что если я изменю TriggerKey на TK_ENTER (другое значение в перечислении triggerkey), я могу без проблем взаимодействовать с элементом управления изображением. Теперь мне просто нужно найти способ запечатлеть нажатие клавиши Enter, чтобы он не делал ничего странного.
Спасибо за помощь!
Причина, по которой я думаю, что вы не можете добраться до 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
}
}
Это немного взломать, но я думаю, что это будет работать. Задавать AllKeys( true );
, Это должно гарантировать, что ваше приложение фиксирует нажатие любой клавиатуры.
AllKeys P / Invoke подпись: http://blogs.msdn.com/b/mikefrancis/archive/2009/03/28/porting-gapi-keys-to-wm-6-1-and-6-5.aspx
Общая информация AllKeys: 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? Одна из этих строк приводит к тому, что ваше событие нажатия клавиш перестает работать?
-PaulH
редактировать
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;
}
}
Теперь только один из них будет наблюдать за кнопкой сканирования в зависимости от того, на какой вкладке вы находитесь.