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

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