2

我想实现从这个答案中获取的代码并模拟点击而不模拟非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);
    }
4

1 回答 1

2

简短的回答:

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

长答案:

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

现在关于 MAKELPARAM,它只是一个宏。你可以在这里看到它的源代码

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

它使用 ( ) 输入和调用MAKELONG宏,将其转换为 a ,并进一步将其转换为 a 。WORDlhDWORDLPARAM

MAKELONG在 Windef.h中定义:

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

JNA确实有LPARAM类型 mapped,存在于WinDef类中。它接受long构造函数的参数。

因此,您必须简单地获取两个 16 位值lh,将它们映射到 a 的最右边 32 位long,然后将其发送给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);
}
于 2020-12-14T06:53:04.787 回答