Honeywell Dolphin 9500 (Pocket PC 2003) C # Обработка событий Конфликты? - PullRequest
11 голосов
/ 16 марта 2011

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

  • 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 #

Цель

Я пытаюсь создать приложение, которое позволяет человеку сканировать штрих-код и затем захватывать изображение. Эти вещи не должны происходить одновременно. Пользователь должен иметь возможность дважды проверить сканирование штрих-кода, а затем перейти к той части приложения, которая обрабатывает захват изображения.


Проблема

Номера строк ссылаются на мой код в ссылке Friendpaste в разделе Код ниже.

У меня есть два обработчика событий: один для события декодирования из элемента управления сканера штрих-кода и один для вызова элемента управления захватом изображения через событие 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.
  • В перечислении TriggerKey (пример в строке 202) есть перечисление для клавиши Enter на устройстве. Я попытался подключить его к элементу управления изображением и отсканировать до элемента управления декодером, но все еще не смог вызвать событие KeyDown.

Код

http://friendpaste.com/355cQOCghvPkE5YR29lthO

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


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

Попроси, и я сделаю все возможное!

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

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Это что-то вроде хака, но я думаю, что это сработает.Установите 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

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

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

1 голос
/ 16 марта 2011

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

}
0 голосов
/ 18 марта 2011

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

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

...