我想实现取自 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);
有谁知道Java或JNA中是否有类似的东西?
请不要推荐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
) 输入 l
和 h
调用 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 位值 l
和 h
,将它们映射到 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/