私は最終的に問題を解決するために管理:)そして、私は、次の解決策が見つかりました:
最初に次に、WindowsメッセージコードをWinUserインターフェイスを拡張し、次のよう
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);
}
でのUSER32インターフェースを拡張しますあなたが必要とする、私の場合、これはWM_DEVICECHANGEです。なぜなら私はUSBデバイスがコンピュータに接続されているか、コンピュータから切り離されているかをチェックしたいからです。
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;
}
次に、実際には私の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);
}
};
そしてどこかにあなたは物事がのSetWindowLong関数でウィンドウプロシージャのための新しいアドレスを追加する初期化したJFrameのコードで:
// Get Handle to current window
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
このコードはうまく動作しますが、私はいくつかの疑問を持っています一つの事に関して。コールバック関数の戻り値が正しいかどうかはわかりません。私は、WM_DEVICECHANGEメッセージを処理した後、コールバック関数がtrueを返す必要があり、私が現在返す値がシステムによって予期されている値であるとは確信していないので、提案はすべて歓迎されています。
誰もが全体のコードに興味があるなら、私はちょうど私が:)
乾杯、 ガボールを支援するよりも幸せだろう、頼むHID通信のために書かれました。私は以前に掲載
あなたが使用したコードを投稿してください。ありがとう。 –
私は1つの質問があります、あなたはRegisterDeviceNotificationのようなものを使用する必要はありませんか、WindowsがWM_DEVICECHANGEを自動的にブロードキャストするポートデバイスを探していますか? –