我想实现的代码取自这个答案,并模拟没有在非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);
}
1条答案
按热度按时间tjjdgumg1#
简短回答:
不,但是你可以自己做。
长话短说:
就像你说的,“jna。。。理论上,我们应该拥有所有的winapi函数。”重要的是要认识到jna有两个组件,它是允许java通过
libffi
,包含在jna
人工制品;以及用户在中贡献的平台Map(包括许多winapiMap)jna-platform
. 因此jna有能力在winapi中Map任何东西,但是有人需要将它贡献给项目,以便与其他人共享他们的工作。现在关于makelparam,它只是一个宏。您可以在这里看到它的源代码:
它称之为
MAKELONG
宏(WORD
)输入l
以及h
,将其转换为DWORD
,并进一步将其转换为LPARAM
.这个
MAKELONG
宏在windef.h中定义:jna确实有
LPARAM
类型Map,存在于WinDef
班级。这需要一段时间long
构造函数的参数。所以你只需要取两个16位的值
l
以及h
,将它们Map到long
,然后把它送到LPARAM
建造师。因此,您寻求的解决方案是: