c# windows-mobile compact-framework event-handling pocketpc

Honeywell Dolphin 9500(Pocket PC 2003) C#Manejo de eventos Conflictos?



windows-mobile compact-framework (3)

Descubrí que si cambio la TriggerKey a TK_ENTER (otro valor en la enumeración de la clave de activación), puedo interactuar con el control de la imagen sin ningún problema. Ahora solo necesito encontrar una forma de capturar esa tecla Enter presionada para evitar que haga algo raro.

¡Gracias por toda la ayuda!

Ambiente

  • Windows XP x32 Visual Studio 2005 Standard Edition
  • Honeywell Dolphin 9500 con Windows Mobile 2003 (Pocket PC 2003)
    • Con escáner de código de barras incorporado y cámara B & W
    • Usando su SDK ubicado aquí .
  • .NET Compact Framework 1.0 SP3 y .NET Framework 1.1
  • Usando VC #

Gol

Estoy intentando crear una aplicación que permita a un individuo escanear un código de barras y luego capturar una imagen. Estas cosas no deberían suceder simultáneamente. El usuario debería poder verificar dos veces el escaneo del código de barras, luego pasar a la parte de la aplicación que maneja la captura de imágenes.

Problema

Los números de línea hacen referencia a mi código en el enlace friendpaste en la sección de Código a continuación.

Tengo dos controladores de eventos en su lugar: uno para el evento de decodificación desde el control del escáner de códigos de barras, y otro para invocar el control de captura de imágenes a través de un evento KeyDown. El control de decodificación tiene su propio manejador / Evento DecodeEventHandler y una clave de activación establecida con una enumeración (lns 201 y 202). El control de imagen, sin embargo, no. Su documentación indica que el Formulario debe tener un controlador de eventos KeyDown (ln 120) y la clave de desencadenante enumeración (ln 178). Al ejecutar la aplicación (sin el controlador de eventos SelectedIndexChanged [ln 76] en su lugar), el escáner de código de barras funciona muy bien, pero cambiando a la pestaña (o Formulario, como he intentado con formularios separados), con el control de captura de imagen y Al presionar la tecla de Disparo en el dispositivo (SCAN en este caso) hace que la computadora de mano siga escaneando un código de barras (luces rojas se encienden, se enciende la luz verde, emite un pitido cuando encuentra un código de barras) en lugar del comportamiento que normalmente se muestra al usar el control de imagen (sin luces, o luces blancas como un flash).

Cosas que he probado

  • IMPORTANTE: si elimino el control de decodificación de la aplicación, el control de imagen funciona. Si construyo una aplicación separada con solo el control de imagen, funciona.
  • Puse un punto de quiebre en la línea 210 y descubrí que el evento KeyDown nunca es golpeado. En este punto traté de segregar de algún modo los manejadores de eventos o controles, así que introduje el manejador de eventos SelectedIndexChanged para mi control de pestañas y al cambiar a la pestaña con el control apropiado, intenté eliminar los manejadores de eventos. Pude eliminar el controlador DecodeEvent, pero aún no pude presionar el delegado del controlador de eventos KeyDown que escribí.
  • Tanto los controles de decodificación como de imagen del SDK de Honeywell tienen eventos de "Desconexión" que (para citar la documentación) "Desconectar del motor de escaneo". Así que intenté desconectar y volver a conectar los controles en función de la pestaña a la que iba a cambiar, pero tampoco tuve éxito en esto.
  • También leí en alguna parte que los eventos de Forma a veces pueden verse afectados si la Forma pierde el foco. Así que implementé el evento / controlador Form.LostControl y puse esto. Focus () para devolver el foco al formulario pero fue en vano.
  • Me encontré con varias personas sugiriendo KeyPreview = true y manejando / delegando los eventos en el nivel del formulario. Parece que .NET Compact Framework versión 1 no implementa esto ya que mis objetos Form no tienen ningún miembro de KeyPreview.
  • Dentro de la enumeración de TriggerKey (ejemplo en la línea 202) hay una enumeración para la tecla Intro en el dispositivo. Intenté cablear eso hasta el control de imagen, y escanear hasta el control del decodificador, pero todavía no pude presionar el evento KeyDown.

Código

http://friendpaste.com/355cQOCghvPkE5YR29lthO

Publiqué el código como un enlace de amistad porque es algo largo (~ 230 líneas). Avísame si debería incluirlo aquí.

¿Necesita información adicional?

¡Pregunta y haré lo mejor que pueda!

Hubiera etiquetado este Honeywell Dolphin 9500 pero soy un nuevo usuario.


Esto es un truco, pero creo que funcionará. Establecer AllKeys( true ); . Eso debería garantizar que su aplicación capture cualquier pulsación del teclado.

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

Información general de AllKeys: http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2009/07/14/just-say-no-to-gapi-what-you-need-to-know-about-allkeys- y-input-management.aspx

Parece que el control de decodificación está tragando el mensaje que necesita. Podría intentar ponerse en contacto con el soporte para desarrolladores de HHP. Si tienen un foro de soporte para desarrolladores en línea, también puede funcionar. Como prueba, ¿qué sucede si comienzas a comentar las líneas 192-202? ¿Una de esas líneas hace que su evento de pulsación deje de funcionar?

-PaulH

Editar

Tanto imageControl como decodeControl aceptan un parámetro TriggerKey . Eso suena como que esperan estar haciendo el evento de tecla presionar ellos mismos.

Prueba esto: solo tienes uno de esos instantes a la vez, dependiendo de la pestaña en la que estés. Deshágase del código de manejo Form1_KeyDown totalidad (incluidas las AllKeys). Ve si eso funciona.

Alternativamente, aún puede matar su manejador Form1_KeyDown , pero mantenga ambos controles tal como están y haga esto en su controlador tabControl1_SelectedIndexChanged en su lugar:

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

Ahora, solo uno de ellos estará mirando el botón de escaneo dependiendo de la pestaña en la que se encuentre.


La razón por la que creo que no se puede acceder al controlador de KeyDown es que el que es para el TabControl1_IndexChanged es un System.EventHandler que es una forma genérica del KeyDown .

Intente hacer algo como esto y vea si atrapa el 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 } }