Honeywell Dolphin 9500 (Pocket PC 2003) конфликты обработки событий C#?


Окружающая среда

  • 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 в разделе кода ниже.

У меня есть два обработчика событий: один для декодирования события из элемента управления сканером штрих-кодов, а другой для вызова изображения захват управления с помощью события KeyDown. Элемент управления decode имеет свой собственный обработчик событий DecodeEventHandler и набор триггерных Ключей с перечислением (lns 201 и 202). Однако управление изображением этого не делает. В его документации говорится, что форма должна иметь обработчик событий KeyDown (ln 120) и перечисление ключей триггера (ln 178). При запуске приложения (без обработчика событий SelectedIndexChanged [ln 76]) сканер штрих-кодов работает отлично, но переключается на вкладку (или форму, как у меня пробовал отдельные формы, а также), с контролем захвата изображения и нажатием кнопки запуска на устройстве (сканирование в этом случае) заставляет КПК действовать так, как будто он все еще сканирует штрих-код (загорается красный свет, появляется зеленый свет прицела, пищит, когда сталкивается со штрих-кодом) вместо поведения, обычно отображаемого при использовании элемента управления изображением (нет света или белого света, как вспышка).


Вещи, которые я пробовал

  • важно: Если я удалю управление декодированием из приложение, управление изображением работает. Если я создаю отдельное приложение с одним только элементом управления изображением,оно работает.
  • я поставил точку останова в строке 210 и обнаружил, что событие KeyDown никогда не попадает. На этом этапе я попытался каким-то образом разделить обработчики событий или элементы управления, поэтому я ввел обработчик событий SelectedIndexChanged для моего элемента управления tab и после переключения на вкладку с соответствующим элементом управления я попытался удалить обработчики событий. Мне удалось удалить DecodeEvent обработчик, но все еще не смог попасть в делегат обработчика событий KeyDown, который я написал.
  • как декодирование, так и управление изображениями из пакета Honeywell SDK имеют события "Disconnect", которые (цитируя документацию) "отключаются от модуля сканирования". Поэтому я попытался отсоединить и повторно подключить элементы управления, основываясь на том, на какую вкладку я переключался, но и в этом мне не удалось.
  • Я также где-то читал, что события формы иногда могут быть нарушены, если форма теряет фокус. Поэтому я осуществил следующее: Форма.LostControl событие / обработчик и поставить в этом.Focus (), чтобы вернуть фокус в форму, но безрезультатно.
  • я столкнулся с несколькими людьми, предлагающими KeyPreview = true и обработку / делегирование событий на уровне формы. Похоже, что .NET Compact Framework версии 1 не реализует это, поскольку объекты my Form не имеют элемента KeyPreview.
  • Внутри перечисления триггерной клавиши (пример в строке 202) есть перечисление для клавиши Enter на устройстве. Я попытался подключить это к изображению управление и сканирование до управления декодером, но все еще не смог попасть в событие KeyDown.

Код

Http://friendpaste.com/355cQOCghvPkE5YR29lthO

Я разместил код как ссылку на friendpaste, потому что он несколько длинноват (~230 строк). Дайте мне знать, если я просто включу его сюда.


Нужна дополнительная информация?

Спрашивайте, и я сделаю все, что в моих силах!

Я бы пометил этот Honeywell Dolphin 9500, но я новый пользователь.

3 11

3 ответа:

Причина, по которой я думаю, что вы не можете добраться до обработчика 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
   }

}

Это немного халтура, но я думаю, что это сработает. Set AllKeys( true );. Это должно гарантировать, что ваше приложение фиксирует любое нажатие клавиатуры.

AllKeys P / Invoke signature: http://blogs.msdn.com/b/mikefrancis/archive/2009/03/28/porting-gapi-keys-to-wm-6-1-and-6-5.aspx

Общая информация по всем ключам: 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 работает?

- Поль

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;
    }
}
Теперь только один из них будет следить за кнопкой сканирования в зависимости от того, на какой вкладке вы находитесь.

Я обнаружил, что если я изменю TriggerKey на TK_ENTER (другое значение в перечислении triggerkey), я могу взаимодействовать с элементом управления изображением без каких-либо проблем. Теперь мне просто нужно найти способ захватить это нажатие клавиши Enter, чтобы он не делал ничего странного.

Спасибо за помощь!