我想要实现从这个答案的代码和模拟点击,而不模拟鼠标移动在非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机器人。我试过了,但不幸的是,鼠标光标将(消失)从起始位置移动到需要单击并返回到起始位置的大约毫秒。
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);
}发布于 2020-12-14 06:53:04
简短答覆:
不,但你可以自己做。
较长的答覆:
就像你说的,"JNA .理论上,应该有所有的WinAPI函数。“重要的是要认识到JNA有两个组件,核心功能允许libffi通过jna工件中包含的本机(C)代码进行接口;以及用户在jna-platform中提供的平台映射(包括许多WinAPI映射)。因此,JNA有能力在WinAPI中映射任何东西,但需要有人将其贡献到项目中,以便与其他人共享他们的工作。
现在关于MAKELPARAM,它只是一个宏。你可以看到这里的源代码
#define MAKELPARAM(l, h) ((LPARAM)(DWORD)MAKELONG(l, h))它调用具有(WORD)输入的l和h的l宏,将其转换为DWORD,并进一步将其转换为LPARAM。
MAKELONG宏是在Windef.h中定义
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))JNA 类型映射,在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);
}https://stackoverflow.com/questions/65283587
复制相似问题