java - JNA 没有来自 Windows API 的函数

标签 java winapi jna

我负责将 Windows JNI 代码移植到 Java,并使用了 JNA。使用这个库很简单,因为它显然试图遵循 Windows 的 API 的结构和风格(我不太了解 API,我遵循原始的 JNI 代码)。
我能够找到与大多数 Windows API 函数等效的 JNA,但找不到 EnableWindow

此函数在winuser.h 中定义从逻辑上讲,应该在 com.sun.jna.platform.win32.WinUser 下找到它, 正确的?但是没有这样的功能,EnableWindow 的唯一提及是在 com.sun.jna.platform.win32.WinUser.WS_DISABLED 的文档中:

[...] To change this after a window has been created, use the EnableWindow function.

仅此而已,没有其他引用、提及或指示该功能。文档的其余部分同样简洁,当人们不确切知道要查看什么内容和在哪里查看时不是很有帮助。

那么 JNA 的 EnableWindow 如果存在的话在哪里呢?如果没有,可以使用什么来替代?

最佳答案

JNA 有两部分:核心功能(在 jna 工件中)和用户贡献的平台映射(在 jna-platform 工件中)。当用户为函数和常量提供映射时,他们通常将 Windows API 文档直接复制到 javadoc 中,因此经常引用尚未(尚未)映射的值。

如您所见,(目前)还没有用户为 EnableWindow 函数提供映射。那个用户可能就是你!

JNA FAQ包括这个花絮:

JNA is missing function XXX in its platform library mappings

No, it's not, it's just waiting for you to add it :)

public interface MyUser32 extends User32 {
   // DEFAULT_OPTIONS is critical for W32 API functions to simplify ASCII/UNICODE details
   MyUser32 INSTANCE = (MyUser32)Native.load("user32", W32APIOptions.DEFAULT_OPTIONS);
   void ThatFunctionYouReallyNeed();
}

这基本上是您自己添加函数的模板:扩展现有库(如果它已部分映射)或创建一个新库(如果尚未映射)(在这种情况下,扩展 Library), 然后添加你需要的功能。

WinUser 与大多数映射略有不同;它不包含库加载语句,因为它只是头文件,在 JNA 中,DLL 加载库扩展 WinUser

因此,您需要做更多的研究,看看要加载哪个 DLL 才能以 native 方式访问该功能。 The docs表明它是 user32.dll,就像 JNA FAQ 示例一样!

所以模板在上面,你只需要函数映射。 Windows BOOL 映射到 Java 的 boolean 因此您只需要在自己的代码库中执行此操作:

public interface MyUser32 extends User32 {
    MyUser32 INSTANCE = (MyUser32) Native.load("user32", W32APIOptions.DEFAULT_OPTIONS);

    boolean EnableWindow(HWND hWnd, boolean bEnable);
}

这将解决您在自己项目中的即时需求。

JNA 是一个用户维护的项目。请考虑将您的映射贡献给 JNA,以便下一个人可以使用您的映射,而无需自己创建!

关于java - JNA 没有来自 Windows API 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68500278/

相关文章:

java - 如何使用java从日期中获取小时数

winapi - 方法和停止功能之间同步的正确方法

java - JNA - 读取多个按键

java - 如何使用 SOAPHandlers 签署 MTOM SOAP 消息?

java - 在Java中将日期转换为长

c++ - 与 Win32 连接混淆 - 为什么这段代码有效?

c - 用户尝试停止服务时出现警告窗口

c - JNA 映射到 C

linux - 如何使用 JNA 在 Linux (X11 lib) 上 Hook 鼠标?

java - 像包装器一样使用 Facade