我試圖通過使用JNA來訪問窗口消息(例如WM_POINTERDOWN)來構建Java應用程序。有了這個選項,我將把我的應用程序變成一個觸摸敏感的應用程序。到目前爲止,我的當前代碼獲取了此窗口消息,但可能會覆蓋其他一些重要的Java本機代碼,以便JFrame不會按我期望的方式做出反應(例如,在調整JFrame的大小時,它會填充新添加的區域黑色)。爲什麼我的JNA使用應用程序沒有正確的反應?
這是我的聽衆,當一個新的窗口收到的郵件將被稱爲:
public MyListener listener = new MyListener() {
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam,
LPARAM lParam) {
//handle the window message here
return User32.INSTANCE.DefWindowProc(hWnd, uMsg, uParam, lParam);
}
};
接口myListener的:
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
public interface MyListener extends StdCallCallback {
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
}
在這個片段我覆蓋JFrame的原生功能,這將通常從操作系統調用,與我的聽衆:
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE
.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
該cl屁股MyUser32:
import com.sun.jna.Callback;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.W32APIOptions;
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);
}
也許有人有這個一個好主意。謝謝。
確保您的回調實現如下窗口約定[鏈接到下一個回調(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(V = vs.85)的.aspx#鏈)。 – technomage