如何将布尔值转为WinDef.LRESULT返回?Java重启管理器实现疑问
解决WM_QUERYENDSESSION返回TRUE的问题
嘿,你完全不用纠结指针的事!Win32里的LRESULT本质是一个整数类型(32位系统对应32位整数,64位系统对应64位整数),而WM_QUERYENDSESSION要求返回的TRUE在Win32标准里就是数值1。
在JNA的WinDef.LRESULT封装中,你只需要传入对应数值就能创建正确的返回实例,直接修改你的回调代码就行:
修改后的回调示例
WindowProc proc = (hwnd, msg, wp, lp) -> { if (msg == WM_QUERYENDSESSION && lp.intValue() == ENDSESSION_CLOSEAPP) { // 返回Win32标准的TRUE(对应数值1) return new WinDef.LRESULT(1L); } // 传递消息给默认窗口过程 return user32.DefWindowProc(hwnd, msg, wp, lp); };
背后的逻辑
- Win32规范里,
WM_QUERYENDSESSION的返回值是BOOL类型,其中TRUE被定义为1,FALSE是0。 - JNA的
WinDef.LRESULT是对Win32原生LRESULT类型的包装,它的构造方法接受一个long类型参数,用来承载返回值的实际数值。 - 这里根本不需要指针,因为
LRESULT本身就是用来传递消息返回值的整数容器,不是指针类型。
优化可读性的小技巧
如果觉得直接写1L不够直观,可以提前定义一个常量:
private static final WinDef.LRESULT LRESULT_TRUE = new WinDef.LRESULT(1L);
之后在回调里直接返回LRESULT_TRUE就好,代码会更清晰。
内容的提问来源于stack exchange,提问作者Pablo Fernandez
相关产品推荐
相关产品推荐

