You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将布尔值转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:21