Honeywell Dolphin 9500 (Pocket PC 2003) C# Конфликты в обработке событий?
-
25-10-2019 - |
Вопрос
Окружающая среда
- 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 Link В разделе кода ниже.
У меня есть два обработчика событий: один для события декодирования от управления сканером штрих -кода, и один для вызова управления захватом изображения через событие Keydown. Управление Decode имеет свое собственное событие/декодированное событие/обработчик и набор ключа триггера с перечислением (LNS 201 и 202). Управление изображения, однако, нет. В его документации говорится, что в форме должен быть обработчик событий Keydown (LN 120) и перечисление ключа триггера (LN 178). После запуска приложения (без выборочного обработчика событий) сканер штрих -кода отлично работает, но переключившись на вкладку (или форму, как я также пробовал отдельные формы), с управлением захватом изображения и Нажатие ключа триггера на устройстве (сканирование в данном случае) заставляет портативный удар ведут себя так, как будто он все еще сканирует штрих -код (приходит красные огни, зеленый свет отображается, звучит, когда встречается с штрих -кодом) вместо поведения, обычно отображаемого при использовании. управление изображением (без света или белых огней, как вспышка).
Вещи, которые я пробовал
- ВАЖНЫЙ: Если я удалю элемент управления Decode из приложения, управление изображением работает. Если я создаю отдельное приложение только с управлением изображением, оно работает.
- Я положил точку перерыва в строке 210 и обнаружил, что событие Keydown никогда не достигается. В этот момент я попытался каким -то образом разделить обработчики или элементы управления событиями, поэтому я представил обработчик SelectedIndexchanged события для управления вкладками и после перехода на вкладку с соответствующим элементом управления, я попытался удалить обработчики событий. Я смог удалить обработчик Decodeevent, но все еще не смог поразить делегата обработчика событий Keydown, который я написал.
- И управление декодом, и изображением из SDK Honeywell имеют события «отключить», которые (цитируют документацию) «отключаются от двигателя сканирования». Поэтому я попытался отключить и переосмыслить элементы управления в зависимости от того, на что вкладка я переключалась, но в этом тоже не удалась.
- Я также где -то читал, что события формирования иногда могут быть нарушены, если форма теряет фокус. Таким образом, я внедрил Form.LostControl Event/Handler и поместил в это .focus (), чтобы вернуть фокус в форму, но безрезультатно.
- Я сталкивался с несколькими людьми, предлагающими Keypreview = true и обработку/делегирование событий на уровне формы. Похоже, что версия 1 Compact Framework не реализует это, так как объекты моей формы не имеют члена Keypreview.
- В рамках Enum TriggerKey (пример в строке 202) есть перечисление для ключа Enter на устройстве. Я попытался подключить это к управлению изображениями и сканировать до управления декодером, но все еще не смог нажать на событие Keydown.
Код
http://friendpaste.com/355CQCHGHVPKE5YR29LTHO
Я опубликовал код как ссылка FriendPaste, потому что он несколько длинный (~ 230 строк). Дайте мне знать, если я должен просто включить это здесь.
Нужна дополнительная информация?
Спросите, и я сделаю все возможное!
Я бы пометил этот Honeywell Dolphin 9500, но я новый пользователь.
Решение 3
Я обнаружил, что если я изменяю триггерн на TK_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/Signature Signature: http://blogs.msdn.com/b/mikefrancis/archive/2009/03/28/porting-gapi-keys-to-wm-6-1-hor-5-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-allkys-and-input- Management.aspx
Похоже, управление декодом глотает необходимое сообщение. Вы можете попробовать связаться с поддержкой разработчиков HHP. Если у них есть онлайн -форум поддержки разработчиков, который тоже может работать. В качестве теста, что произойдет, если вы начнете комментировать строки 192-202? Одна из этих строк заставляет ваше событие Keydown прекратить работу?
-Полх
Редактировать
ImageControl и DecodeControl оба принимают TriggerKey
параметр. Похоже, они ожидают, что будут выполнять мероприятия Keypress.
Попробуйте это: иметь только один из тех, кто создается за раз в зависимости от того, на какой вкладке вы находитесь. Избавиться от 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;
}
}
Теперь только один из них будет смотреть кнопку сканирования в зависимости от того, на какой вкладке вы.