Java 为什么我对winapi RegisterClassExW的调用失败(使用JNA)?
这些是winapi方法Java 为什么我对winapi RegisterClassExW的调用失败(使用JNA)?,java,winapi,jna,Java,Winapi,Jna,这些是winapi方法 ATOM WINAPI RegisterClassEx( _In_ const WNDCLASSEX *lpwcx ); typedef struct tagWNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; H
ATOM WINAPI RegisterClassEx(
_In_ const WNDCLASSEX *lpwcx
);
typedef struct tagWNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
我的Java代码:-
public class WNDCLASSEX extends com.sun.jna.Structure {
public int cbSize;
public int style;
public WNDPROC lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public HMODULE hInstance;
public HICON hIcon;
public HCURSOR hCursor;
public HBRUSH hbrBackground;
public String lpszMenuName;
public String lpszClassName;
public HICON hIconSm;
}
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
Atom RegisterClassExW(WNDCLASSEX wc);
}
public class other {
public static void main(String[] args){
User32.WNDPROC WndProc = new User32.WNDPROC() {
public LRESULT callback(HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
int id = User32.INSTANCE.GetWindowThreadProcessId(hWnd, null);
return new LRESULT(0);
}
};
WNDCLASSEX wc = new WNDCLASSEX();
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = null;
wc.hIcon = null;
wc.hbrBackground = null;
wc.cbSize= wc.size();
wc.lpszMenuName = null;
wc.lpszClassName = "Magnifier";
Atom atom = User32.INSTANCE.RegisterClassExW(wc);
}
}
如果调用RegisterClassExwc方法,则会出现以下错误。我认为问题在于wc是一个对象,但RegisterClassesXW接受指针
如果是这样,如何将wc作为指针发送?
否则我怎么解决这个问题
错误是
主线程java.lang.IllegalArgumentException中出现异常:函数RegisterClassesXw的参数0处的参数类型jna.extra.WNDCLASSEX不受支持
WNDCLASSEX需要扩展结构,然后需要实现其getFieldOrder方法
您的错误消息在哪里?@Jan我已经更新了问题。那么,User32.INSTANCE.RegisterClassExW对其参数的期望是什么?错误信息再清楚不过了。令人失望的是,您最初发布的代码是假的。请从中吸取教训。另外,你的窗口程序完全被破坏了,所以失败就在那里等待着你。打电话给DefWndProc。您已经为窗口类指定了一个由内置类使用的名称。您不能注册放大镜类。系统注册了它。用户没有发布真正的代码,因为用户正在他们的类中调用size方法。大概真正的代码已经和你的一样了。我们需要说服提问者解决这个问题。啊,我没有注意到@毗瑟奴,请更新你的问题。@technomage谢谢你的提问,但是如何知道它注册的课程是否成功。因为RegisterClassExW函数返回一个原子,但若我使用它来创建窗口,它显示1407找不到窗口类。错误。RegisterClassEx的文档描述了如何报告失败。我已经这样做了。如果我打印getLastError,它将0显示为响应。这意味着没有错误
public class WNDCLASSEX extends com.sun.jna.Structure {
public int cbSize;
public int style;
public WNDPROC lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public HMODULE hInstance;
public HICON hIcon;
public HCURSOR hCursor;
public HBRUSH hbrBackground;
public String lpszMenuName;
public String lpszClassName;
public HICON hIconSm;
public List getFieldOrder() {
return Arrays.asList("cbSize","style","lpfnWndProc","cbClsExtra","cbWndExtra","hInstance","hIcon","hCursor","hbrBackground","lpszMenuName","lpszClassName","hIconSm");
}
}