在java/jna中有类似makelparam的东西吗?

kmb7vmvb  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(320)

我想实现的代码取自这个答案,并模拟没有在非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);
    }
tjjdgumg

tjjdgumg1#

简短回答:
不,但是你可以自己做。
长话短说:
就像你说的,“jna。。。理论上,我们应该拥有所有的winapi函数。”重要的是要认识到jna有两个组件,它是允许java通过 libffi ,包含在 jna 人工制品;以及用户在中贡献的平台Map(包括许多winapiMap) jna-platform . 因此jna有能力在winapi中Map任何东西,但是有人需要将它贡献给项目,以便与其他人共享他们的工作。
现在关于makelparam,它只是一个宏。您可以在这里看到它的源代码:


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

它称之为 MAKELONG 宏( WORD )输入 l 以及 h ,将其转换为 DWORD ,并进一步将其转换为 LPARAM .
这个 MAKELONG 宏在windef.h中定义:


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

jna确实有 LPARAM 类型Map,存在于 WinDef 班级。这需要一段时间 long 构造函数的参数。
所以你只需要取两个16位的值 l 以及 h ,将它们Map到 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);
}

相关问题