fin he conseguido resolver el problema :) Y me encontré con la siguiente solución:
Primera ampliar la interfaz User32 de la siguiente manera
public interface MyUser32 extends User32 {
public static final MyUser32 MYINSTANCE = (MyUser32) Native.loadLibrary("user32", MyUser32.class, W32APIOptions.UNICODE_OPTIONS);
/**
* Sets a new address for the window procedure (value to be set).
*/
public static final int GWLP_WNDPROC = -4;
/**
* Changes an attribute of the specified window
* @param hWnd A handle to the window
* @param nIndex The zero-based offset to the value to be set.
* @param callback The callback function for the value to be set.
*/
public int SetWindowLong(WinDef.HWND hWnd, int nIndex, Callback callback);
}
luego extender la interfaz winuser con el código de mensajes de Windows que necesita, en mi caso este es el WM_DEVICECHANGE, porque quiero verificar que el dispositivo USB esté conectado o desconectado de la computadora.
public interface MyWinUser extends WinUser {
/**
* Notifies an application of a change to the hardware configuration of a device or the computer.
*/
public static final int WM_DEVICECHANGE = 0x0219;
}
A continuación, cree una interfaz con la función de devolución de llamada, que en realidad será mi función WndProc.
//Create the callback interface
public interface MyListener extends StdCallCallback {
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
}
public MyListener listener = new MyListener()
{
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam)
{
if (uMsg == MyWinUser.WM_DEVICECHANGE)
{
// TODO Check If my device was attached or detached
return new LRESULT(1);
}
return new LRESULT(0);
}
};
Y a continuación, en alguna parte del código del JFrame donde inicializar cosas agregar la nueva dirección para el procedimiento de ventana con la función SetWindowLong:
// Get Handle to current window
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
Este código funciona muy bien, pero tengo algunas dudas con respecto a una cosa. No estoy seguro de si el valor de retorno de la función de devolución de llamada es correcto. Leí en MSDN que, después de manejar un mensaje WM_DEVICECHANGE, la función de devolución de llamada debe ser verdadera y no estoy seguro de que el valor que estoy devolviendo actualmente sea el esperado por el sistema, por lo que cualquier sugerencia es bienvenida.
Si alguien está interesado en todo el código que he escrito para la comunicación HID sólo pregunte, yo sería más que feliz de ayudar :)
Saludos, Gabor.
Puede publicar el código que ha utilizado. Gracias. –
Tengo una pregunta: ¿No tiene que usar algo como RegisterDeviceNotification o simplemente está buscando dispositivos de puertos para los que Windows transmite WM_DEVICECHANGE automáticamente? –