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;
    }
}

Теперь только один из них будет наблюдать за кнопкой сканирования в зависимости от того, на какой вкладке вы находитесь.

Другие вопросы по тегам