在JNA中创建一个本机Windows窗口,并使用GWL_WNDPROC创建一些GetWindowLong

在JNA中创建一个本机Windows窗口,并使用GWL_WNDPROC创建一些GetWindowLong,windows,winapi,jna,wndproc,createwindow,Windows,Winapi,Jna,Wndproc,Createwindow,你好 我已经使用JNA与Windows API交互了一段时间,现在我在创建窗口时遇到了麻烦。就我所做的而言: 1.已创建现有窗口的子窗口,并已获取该子窗口的有效处理程序。 2.了解Windows中的每个窗口都有一个不间断的消息分派循环。 3.我知道将我的窗口包含在消息分派循环中的最佳方法是使用类似以下代码的代码(不是我的,但我也会这样做): 但是,我的问题是,当我调用父窗口的GetWindowLong()时(我的第一行代码)指针的值为0,表示函数没有成功完成。随后对GetLastError()的

你好

我已经使用JNA与Windows API交互了一段时间,现在我在创建窗口时遇到了麻烦。就我所做的而言: 1.已创建现有窗口的子窗口,并已获取该子窗口的有效处理程序。 2.了解Windows中的每个窗口都有一个不间断的消息分派循环。 3.我知道将我的窗口包含在消息分派循环中的最佳方法是使用类似以下代码的代码(不是我的,但我也会这样做):

但是,我的问题是,当我调用父窗口的GetWindowLong()时(我的第一行代码)指针的值为0,表示函数没有成功完成。随后对GetLastError()的调用和对错误代码的快速检查会给我一个“访问被拒绝”错误。当然,这是合乎逻辑的,因为我正在尝试从自己的线程访问另一个线程的WNDPROC地址,但我想知道是否有任何方法(当然应该有)可以绕过这一点

有什么建议吗?(双关语)

在JNA调用后不要使用GetLastError()。JNA&JNI可能会调用其他api来更改最后一个错误。使用抛出LastErrorException的子句声明SetWindowLong,如下所示:

int SetWindowLongA(int hWnd, int nIndex, WndProcCallbackListener dwNewLong)
    throws LastErrorException;
注意名字后面的“A”。它明确使用了ANSI版本。您也可以使用SetWindowLongW

确保回调同时实现回调和StdCall。我更喜欢尽可能多地使用基元类型,因为这使得映射对JNA来说既快又明显:

public interface WndProcCallbackListener extends Callback, StdCall {

    int callback(int hWnd, int Msg, int wParam, int lParam);

}

更新:如果您使用原语,您的应用程序将无法在32位和64位JVM之间移植。这不是什么大问题。我只为32位JVM制作JNA应用程序,因为它们可以安装在任何Windows版本(32位和64位)上,并且32位JVM将始终访问32位版本的Windows库,即使在64位Windows上运行也是如此。
public interface WndProcCallbackListener extends Callback, StdCall {

    int callback(int hWnd, int Msg, int wParam, int lParam);

}