ich es endlich geschafft, das Problem zu lösen :) Und ich fand die folgende Lösung:
zuerst die User32 Schnittstelle auf folgende Weise erweitern
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);
}
die winuser Schnittstelle mit dem Windows Message Code erweitern dann das brauchst du, in meinem Fall ist das der WM_DEVICECHANGE, weil ich überprüfen will, ob das USB-Gerät an den Computer angeschlossen oder von ihm gelöst wurde.
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;
}
Dann erstellen Sie eine Schnittstelle mit der Callback-Funktion, die tatsächlich meine WndProc-Funktion sein wird.
//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);
}
};
Und dann irgendwo im Code des JFrame, wo Sie initialisieren Dinge die neue Adresse für die Fensterprozedur mit der SetWindowLong Funktion hinzufügen:
// Get Handle to current window
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
Dieser Code funktioniert gut, aber ich habe einige Zweifel in Bezug auf eine Sache. Ich bin mir nicht sicher, ob der Rückgabewert der Callback-Funktion korrekt ist. Ich habe in der MSDN gelesen, dass nach der Behandlung einer WM_DEVICECHANGE Nachricht die Callback-Funktion True zurückgeben sollte und ich bin mir nicht sicher, dass der Wert, den ich momentan zurückgebe, der vom System erwartete Wert ist.
Wenn jemand interessiert sich für den gesamten Code, den ich für die HID-Kommunikation geschrieben habe gerade fragen, wäre ich mehr als glücklich :)
Beifall zu helfen, Gabor.
Können Sie bitte den Code, den Sie verwendet haben, posten. Vielen Dank. –
Ich habe eine Frage, mussten Sie nicht etwas wie RegisterDeviceNotification verwenden oder Sie suchen nur nach Ports-Geräten, für die Windows WM_DEVICECHANGE automatisch ausstrahlt? –