Honeywell Dolphin 9500 (Pocket PC 2003) Проблемы с обработкой событий на С#?
Окружающая среда
- 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
- Использование VС#
Цель
Я пытаюсь создать приложение, которое позволяет человеку сканировать штрих-код, а затем фиксировать изображение. Эти вещи не должны происходить одновременно. Пользователь должен иметь возможность дважды проверять сканирование штрих-кода, а затем переходить на часть приложения, которое обрабатывает захват изображения.
Проблема
Номера строк ссылаются на мой код в ссылку друга в разделе "Код" ниже.
У меня есть два обработчика событий: один для события декодирования из управления сканированием штрих-кода и один для вызова управления захватом изображения через событие KeyDown. Элемент управления декодированием имеет свое собственное событие/обработчик DecodeEventHandler и триггерный ключ с перечислением (lns 201 и 202). Однако контроль изображения не работает. В его документации указано, что в форме должен быть обработчик события KeyDown (ln 120) и перемычка ключа запуска (ln 178). После запуска приложения (без обработчика событий SelectedIndexChanged [ln 76]) сканер штрих-кода отлично работает, но переключается на вкладку (или Form, как я уже пробовал отдельные формы), с контролем захвата изображения и нажатие клавиши Trigger на устройстве (SCAN в этом случае) приводит к тому, что карманный компьютер работает так, как будто он все еще сканирует штрих-код (загораются красные огни, зеленый индикатор показывает, подает звуковой сигнал при обнаружении штрих-кода) вместо поведения, обычно отображаемого при использовании управление изображением (без огней или белых огней, таких как вспышка).
Вещи, которые я пробовал
- ВАЖНО: Если я удалю элемент управления декодированием из приложения, управление изображением будет работать. Если я создаю отдельное приложение только с контролем изображения, оно работает.
- Я поставил точку прерывания в строке 210 и обнаружил, что событие KeyDown никогда не попадает. В этот момент я попытался как-то изолировать обработчики событий или элементы управления, поэтому я представил обработчик события SelectedIndexChanged для моего элемента управления вкладкой и, перейдя на вкладку с соответствующим элементом управления, попытался удалить обработчики событий. Мне удалось удалить обработчик DecodeEvent, но он все еще не смог попасть в делегат обработчика событий KeyDown, который я написал.
- Оба элемента управления декодированием и изображением из Honeywell SDK имеют события "Отключить", которые (чтобы процитировать документацию) "Отключить от механизма сканирования". Поэтому я попытался отключить и снова подключить элементы управления, на основе которых я переключился, но в этом тоже не увенчался успехом.
- Я также читал, что события формы иногда могут быть нарушены, если форма теряет фокус. Поэтому я внедрил событие/обработчик Form.LostControl и включил this.Focus(), чтобы вернуть фокус в форму, но безрезультатно.
- Я столкнулся с несколькими людьми, предлагающими KeyPreview = true и обработку/делегирование событий на уровне формы. Похоже, что .NET Compact Framework версии 1 не реализует это, так как мои объекты формы не имеют элемента KeyPreview.
- Внутри перечисления TriggerKey (пример в строке 202) есть перечисление для клавиши Enter на устройстве. Я попробовал подключиться к управлению изображениями и отсканировал до элемента управления декодером, но все еще не смог попасть в событие KeyDown.
код
http://friendpaste.com/355cQOCghvPkE5YR29lthO
Я разместил код как ссылку для ссылки, потому что он несколько длинный (~ 230 строк). Дайте мне знать, если я просто включу его здесь.
Нужна дополнительная информация?
Спроси, и я сделаю все возможное!
Я бы пометил этот Honeywell Dolphin 9500, но я новый пользователь.
Ответы
Ответ 1
Я обнаружил, что если я изменил TriggerKey на TK_ENTER (другое значение в перечислении триггерной клавиши), я могу взаимодействовать с управлением изображением без каких-либо проблем. Теперь мне просто нужно найти способ захвата этого нажатия клавиши Enter, чтобы он не делал ничего странного.
Спасибо за помощь!
Ответ 2
Причина, по которой я не могу попасть в обработчик 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
}
}
Ответ 3
Это немного взломать, но я думаю, что это сработает. Установите 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? Ли одна из этих строк приводит к прекращению работы вашего события keydown?
-PaulH
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;
}
}
Теперь только один из них будет смотреть кнопку сканирования в зависимости от того, на какой вкладке вы находитесь.