2009-04-19 18 views
5

Escribo una aplicación SWT que necesita sentarse en la bandeja del sistema y abrirse automáticamente cada vez que el usuario conecta algún dispositivo USB (la aplicación sirve como su panel de control).SWT: Recibir notificaciones de un cambio de dispositivo del sistema (conexión/desconexión del dispositivo USB)

La manera de hacerlo en el entorno nativo (win32 en este caso, pero al final debería ser independiente de la plataforma) es escuchar el evento WM_DEVICECHANGE y luego verificar si mi dispositivo ha sido desconectado.

Haciendo búsquedas en el tema, parece que SWT no maneja este tipo de evento. ¿Alguien tiene alguna idea de cómo lograr esto? Mi solución alternativa sería el muestreo del puerto USB cada n segundos, buscando el dispositivo, pero esto es una solución no-no en lo que a mí respecta ...

Gracias y saludos

Shai

+0

Para ser claros, estamos hablando acerca de la Standard Widget Toolkit en Java, ¿verdad? Si es así, agrega una etiqueta "Java". ¿O te refieres a algún otro SWT? – Jegschemesch

+0

derecha. era tan natural para mí que olvidé por completo agregar el más básico :) –

+0

Eventualmente, me conformé con un oyente activo, sondeando la DLL del controlador USB cada n milisegundos. –

Respuesta

0

Java no proporciona interacción directa con los dispositivos y con USB. Existen varias bibliotecas de terceros para Java que proporcionan funciones relacionadas con USB (lectura/escritura desde el puerto USB). Por ejemplo: http://www.icaste.com/ (comercial)

+0

No necesito conexión USB. Lo hago utilizando una DLL suministrada con el dispositivo al que me estoy conectando envuelto por JNA. Necesito escuchar el mensaje SO WM_DEVICE_CHANGED. –

1

EDIT: J-16 SDiZ informó de que existe la API para Windows demasiado

Aquí es un artículo muy bueno sobre Access USB devices from Java applications

El módulo JUSB descrito contiene un USBListener objeto.

Interfaz implementada por objetos que desean supervisar la estructura USB. El orden en que se informan estos cambios no necesariamente será el orden en que se vieron los cambios en el mundo real, y también se producen retrasos.

objeto

Youre SWT puede implementar este oyente y hacer algo, cuando el método

deviceAdded(Device dev) 

se dispara

+0

Por lo que puedo ver, jUSB no es compatible con win32, que es la plataforma principal que debe admitir esta aplicación. –

+0

lo siento, es su derecho. Está funcionando solo para Linux. –

0

Su comentario acerca de Zorglub sugiere que usted tiene algunos (presumiblemente) JNI/JNA código para llamar a la DLL de terceros que mencionaste. Supongo que también podría escribir un contenedor JNI en la API de Windows, donde puede registrarse para recibir notificaciones sobre el evento _WM_DEVICECHANGE_ que mencionó.

+0

que probablemente sea lo correcto, dado que hay suficientes recursos disponibles para este desarrollo. Desafortunadamente, este no es el caso ... finalmente me conformé con un oyente activo. –

Cuestiones relacionadas