0

Java swing アプリケーションから USB デバイスの到着とデバイス削除完了イベントの通知を登録しようとしています。

呼び出しに成功しました

SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);

リスナーを登録すると、 type の通知を受け取りWM_DEVICECHANGEます。ここまでは順調ですね。

次に、RegisterDeviceNotification を呼び出して、デバイスの到着が通知され、完全なイベントが削除されるようにします。これが私が試したことです:

HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(frame));
DEV_BROADCAST_DEVICEINTERFACE filter = new DEV_BROADCAST_DEVICEINTERFACE();
filter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;       
filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
filter.dbcc_name = new char[1];
filter.dbcc_reserved = new DWORD(0);
filter.dbcc_size = new DWORD(filter.size());
filter.dbcc_size = new DWORD(filter.size());

long retVal = MyUser32.MYINSTANCE.RegisterDeviceNotification(new HANDLE(hWnd.getPointer()), filter.getPointer(), DEVICE_NOTIFY_WINDOW_HANDLE);

if (retVal != 0) {
    System.out.println("Error registering for usb: " + Native.getLastError());
}

私のJNA宣言は次のとおりです。

public long RegisterDeviceNotification(HANDLE hRecipient, Pointer NotificationFilter, DWORD Flags);

public static class DEV_BROADCAST_DEVICEINTERFACE extends Structure {
      public DWORD dbcc_size;
      public DWORD dbcc_devicetype;
      public DWORD dbcc_reserved;
      public GUID  dbcc_classguid;
      public char[] dbcc_name;
}

public static final GUID GUID_DEVINTERFACE_USB_DEVICE = new GUID(new byte[] {
        (byte)0xA5, (byte)0xDC, (byte)0xBF, 0x10, 0x65, 0x30, 0x11, (byte)0xD2, (byte)0x90, 0x1F, 0x00, (byte)0xC0, 0x4F, (byte)0xB9, 0x51, (byte)0xED          
});

エラー 1066 が常に表示されます。さらに情報が必要な場合は、お知らせください。含めることができます。

4

1 に答える 1

0

RegisterDeviceNotification が long を返すように宣言すると、問題が発生していました。JNA FAQ によると、JNA FAQ

実際、誰もこの質問をすることはありませんが、彼らは本当に答えを必要としています. Java を長く使用しないでください。

Windows では、ネイティブの long 型は常に 32 ビットであるため、Java int を使用できます。他のプラットフォームでは、タイプが 32 ビットまたは 64 ビットである可能性があるため、NativeLong タイプを使用して、適切なサイズが使用されるようにする必要があります。

于 2012-05-10T20:28:58.147 に答える