Java 为什么使用JNA的应用程序不';你没有做出正确的反应吗?
我正试图通过使用JNA来访问窗口消息(例如WM_POINTERDOWN)来构建一个java应用程序。使用此选项,我将把我的应用程序变成触摸敏感应用程序。到目前为止,我的当前代码得到了这个窗口消息,但可能会覆盖其他一些重要的java本机代码,因此JFrame不会以我期望的方式做出反应(例如,当将JFrame调整为更大的大小时,它会将新添加的区域填充为黑色) 这是我的侦听器,当新窗口消息到达时将调用它:Java 为什么使用JNA的应用程序不';你没有做出正确的反应吗?,java,swing,jna,Java,Swing,Jna,我正试图通过使用JNA来访问窗口消息(例如WM_POINTERDOWN)来构建一个java应用程序。使用此选项,我将把我的应用程序变成触摸敏感应用程序。到目前为止,我的当前代码得到了这个窗口消息,但可能会覆盖其他一些重要的java本机代码,因此JFrame不会以我期望的方式做出反应(例如,当将JFrame调整为更大的大小时,它会将新添加的区域填充为黑色) 这是我的侦听器,当新窗口消息到达时将调用它: public MyListener listener = new MyListener() {
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);
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);
}
也许有人对此有个好主意。谢谢。在您的回调过程中,您正在调用User32.INSTANCE.DefWindowProc,而实际上您应该调用您用SetWindowLong覆盖的过程。过程调用流程应如下所示:
(root)默认WndProc确保回调实现遵循windows约定。
public interface MyUser32 extends User32 {
public static final MyUser32 MYINSTANCE = (MyUser32) Native.loadLibrary("user32", MyUser32.class, W32APIOptions.UNICODE_OPTIONS);
interface WNDPROC extends StdCallCallback {
LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
}
LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex) throws LastErrorException;
LRESULT CallWindowProc(LONG_PTR proc, HWND hWnd, int uMsg, WPARAM uParam, WinDef.LPARAM lParam) throws LastErrorException;
LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, WNDPROC wndProc) throws LastErrorException;
}
private LONG_PTR baseWndProc;
public MyUser32.WNDPROC listener = new MyUser32.WNDPROC () {
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam,
LPARAM lParam) {
// TODO handle the window message
// calling the base WndProc
return MyUser32.MYINSTANCE.CallWindowProc(this.baseWndProc, hWnd, uMsg, wParam, lParam);
}
};
this.baseWndProc = MyUser32.MYINSTANCE.SetWindowLongPtr(hWnd, MyUser32.GWL_WNDPROC, this.listener);
this.baseWndProc = MyUser32.MYINSTANCE.GetWindowLongPtr(hWnd, MyUser32.GWL_WNDPROC);
MyUser32.MYINSTANCE.SetWindowLongPtr(hWnd, MyUser32.GWL_WNDPROC, this.listener);