Cuối cùng tôi quản lý để giải quyết vấn đề :) Và tôi tìm thấy giải pháp sau đây:
Đầu tiên mở rộng giao diện User32 theo cách sau
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);
}
Sau đó, mở rộng giao diện WinUser với mã Windows Message mà bạn cần, trong trường hợp của tôi đây là WM_DEVICECHANGE, bởi vì tôi muốn kiểm tra xem thiết bị USB đã được gắn hay tháo ra khỏi máy tính chưa.
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;
}
Sau đó, tạo giao diện với chức năng gọi lại, đây thực sự là hàm WndProc của tôi.
//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);
}
};
Và rồi đâu đó trong mã của JFrame nơi bạn khởi tạo điều thêm địa chỉ mới cho các thủ tục cửa sổ với chức năng SetWindowLong:
// Get Handle to current window
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
Mã này hoạt động độc đáo, nhưng tôi có một số nghi ngờ liên quan đến một điều. Tôi không chắc liệu giá trị trả về của hàm gọi lại có đúng không. Tôi đã đọc trong MSDN rằng sau khi xử lý một tin nhắn WM_DEVICECHANGE chức năng gọi lại nên trả về true và tôi không chắc chắn rằng giá trị tôi hiện đang quay trở lại là một trong những dự kiến của hệ thống, vì vậy bất kỳ đề nghị được chào đón.
Nếu bất cứ ai quan tâm đến toàn bộ mã tôi đã viết cho truyền thông HID chỉ cần hỏi, tôi sẽ hạnh phúc hơn để giúp :)
Chúc mừng, Gabor.
Bạn có thể vui lòng đăng mã bạn đã sử dụng không. Cảm ơn. –
Tôi có một câu hỏi, Bạn không phải sử dụng một cái gì đó như RegisterDeviceNotification hoặc bạn chỉ tìm kiếm các thiết bị cổng mà các cửa sổ phát sóng WM_DEVICECHANGE tự động? –