Pregunta

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#

Meta

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 debe poder verificar dos veces el escaneo de códigos 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 están haciendo referencia a mi código en el enlace de pasta de amigos en la sección del código a continuación.

Tengo dos controladores de eventos en su lugar: uno para el evento de decodificación del control del escáner de código de barras y uno para invocar el control de captura de imágenes a través de un evento de tecla. El control Decode tiene su propio evento/manejador decodeeventhandler y un conjunto de llave de activación con un enum (LNS 201 y 202). El control de la imagen, sin embargo, no lo hace. Su documentación establece que el formulario debe tener un controlador de eventos Keydown (LN 120) y la tecla de activación enum (LN 178). Al ejecutar la aplicación (sin el controlador de eventos seleccionado IdexChanged [ln 76] en su lugar), el escáner de código de barras funciona muy bien, pero cambia a la pestaña (o forma, ya que también he probado formularios separados), con el control de captura de imágenes y Presentar la tecla de activación en el dispositivo (escanear en este caso) hace que la computadora de mano actúe como si todavía estuviera escaneando un código de barras (las luces rojas se encienden, se muestra la luz verde, los pitidos cuando encuentran un código de barras) en lugar del comportamiento que se muestra normalmente cuando se usa cuando se usa El control de la 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 la imagen, funciona.
  • Puse un punto de quiebre en la línea 210 y descubrí que el evento Keydown nunca se ha golpeado. En este punto, intenté segregar de alguna manera los controladores o controles de eventos, así que introduje el controlador de eventos seleccionado IdexChanged para el control de mi pestaña y al cambiar a la pestaña con el control apropiado, intenté eliminar los controladores de eventos. Pude eliminar el controlador de decodiogente, pero aún no pude llegar al delegado del controlador de eventos Keydown que escribí.
  • Los controles de decodificación y imagen del SDK de Honeywell tienen eventos de "desconectar" que (para citar la documentación) "desconectar del motor de escaneo". Así que intenté desconectar y reconectar controles en función de qué pestaña estaba cambiando pero también no tuve éxito en esto.
  • También leí en algún lugar que los eventos de formulario a veces se pueden interrumpir si el formulario pierde el enfoque. Así que implementé el evento/controlador de lostcontrol y puse este.focus () para devolver el enfoque al formulario pero en vano.
  • Me he encontrado con varias personas que sugieren KeyPreview = True y manejan/delegaron los eventos en el nivel de formulario. Parece que el .NET Compact Framework versión 1 no implementa esto, ya que mis objetos de formulario no tienen un miembro de KeyPreview.
  • Dentro del enum de TriggerKey (ejemplo en la línea 202) hay un enumo para la tecla Intro en el dispositivo. Intenté cablear eso hasta el control de la imagen y escanear hasta el control del decodificador, pero aún no pude presionar el evento Keydown.

Código

http://friendpaste.com/355cqocghvpke5yr29ltho

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


¿Necesita información adicional?

¡Pregunta y haré lo mejor que pueda!

Habría etiquetado este Honeywell Dolphin 9500 pero soy un nuevo usuario.

¿Fue útil?

Solución 3

Descubrí que si cambio el TriggerKey a TK_enter (otro valor en el enum de TriggerKey), puedo interactuar con el control de la imagen sin ningún problema. Ahora solo necesito encontrar una manera de capturar esa tecla Enter Press para evitar que haga algo extraño.

¡Gracias por toda la ayuda!

Otros consejos

La razón por la que creo que no puedes llegar al KeyDown el manejador es 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 está atrapando 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
   }

}

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

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

Información general de Allkeys: http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2009/07/14/just-say-no-to-papi- what-you-need-toknow-bout-allkeys-ing-input---input- gestión.aspx

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

-Paulh

Editar

El imageControl y el decodecontrol aceptan un TriggerKey parámetro. Parece que esperan hacer el evento KeyPress que se maneja a sí mismos.

Pruebe esto: solo tenga uno de esos instanciados a la vez, dependiendo de en qué pestaña se encuentre. Deshacerse de Form1_KeyDown Manejo de código todos juntos (incluidos los Allkeys). Vea si eso funciona.

Alternativamente, aún puedes matar tu Form1_KeyDown manejador, pero mantén ambos controles como son y haz esto en tu tabControl1_SelectedIndexChanged manejador 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 verá el botón de escaneo dependiendo de en qué pestaña se encuentre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top