java - Java/JNA中有类似MAKELPARAM的东西吗?

标签 java winapi jna lparam

我想实现取自 this answer 的代码并模拟单击,而不模拟非 Java 应用程序窗口内的鼠标移动。我知道JNA,理论上它应该具有所有WinAPI 函数。最新的 JNA 版本是 5.6.0,但我没有找到类似于 MAKELPARAM 的东西。

POINT pt;
    pt.x = 30; // This is your click coordinates
    pt.y = 30;

HWND hWnd = WindowFromPoint(pt);
LPARAM lParam = MAKELPARAM(pt.x, pt.y);
PostMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, lParam);
PostMessage(hWnd, WM_RBUTTONUP, MK_RBUTTON, lParam);

有谁知道JavaJNA中是否有类似的东西?

请不要推荐Java Robot。我已经尝试过了,但不幸的是,鼠标光标移动(消失)大约一毫秒,从起始位置到您需要单击的位置,然后返回到起始位置。

public void performClick(int x, int y) {
        Point origLoc = MouseInfo.getPointerInfo().getLocation();
        robot.mouseMove(x, y);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.mouseMove(origLoc.x, origLoc.y);
    }

最佳答案

简短回答:

不,但您可以自己轻松完成。

长答案:

正如您所说,“JNA ...理论上应该具有所有 WinAPI 功能。”需要认识到的重要一点是,JNA 有两个组件,核心功能是允许 Java 通过 libffi 与 native (C) 代码交互,包含在 jna 工件中;以及 jna-platform 中用户提供的平台映射(包括许多 WinAPI 映射)。因此,JNA 能够映射 WinAPI 中的任何内容,但需要有人将其贡献给项目才能与其他人分享他们的工作。

现在关于MAKELPARAM,它只是一个宏。你可以看到source code for it here :

#define MAKELPARAM(l, h)      ((LPARAM)(DWORD)MAKELONG(l, h))

它使用 (WORD) 输入 lh 调用 MAKELONG 宏,并将其转换为 DWORD,并进一步将其转换为 LPARAM

MAKELONG 宏是 defined in Windef.h :

#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))

JNA does have the LPARAM type mapped ,存在于 WinDef 类中。构造函数需要一个long 参数。

因此,您必须简单地获取两个 16 位值 lh,将它们映射到 long 的最右边 32 位,然后将这个长发送到 LPARAM 构造函数。

所以您寻求的解决方案是:

// int args are needed for unsigned 16-bit values
public static WinDef.LPARAM makeLParam(int l, int h) {
    // note the high word bitmask must include L
    return new WinDef.LPARAM((l & 0xffff) | (h & 0xffffL) << 16);
}

关于java - Java/JNA中有类似MAKELPARAM的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65283587/

相关文章:

winapi - 如何在MFC中创建可调整大小的CDialog?

java - 将php页面引入java代码中

java - 如何在整数数组、映射、哈希集等中找到给出相同结果的第一个和最后一个值?

c++ - 单击清除编辑框文本

winapi - CI 服务器上的 MSBuild 找不到 AL.exe

java - 仅在使用 java 11 的 Windows 10 上,64 位 dll 的内存访问无效

JAVA方法调用方法

java - JNA - EnumProcessModules() 不返回所有 DLL?

java - 使用反射获取列表的副本

java - jvisualvm:卡在 "Loading Heap Dump"屏幕上