c++ SendInput无法通过Java Native Access正确执行鼠标移动[重复]

jk9hmnmh  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(135)
    • 此问题在此处已有答案**:

Sending a Keyboard Input with Java JNA and SendInput()(1个答案)
3天前关闭。

意图

我正试图创建一个本地化的云游戏实现,用户自己的PC作为服务器。我试图实现的是最后一个阻止我的东西。那就是实现硬件鼠标移动。这就是Windows的SendInput()发挥作用的地方。

问题

我现在的问题是我的整个代码都是基于Kotlin/Java的。所以,除了使用JNA访问C++函数,我不知道如何在Java中复制SendInput()的函数。更具体地说,是访问SendInput()。但是,这就是我卡住的地方。我的Java代码可以编译,但在调用时不能执行。

要转换为Java的代码

#include<windows.h>
#include<iostream>
using namespace std;

void moveMouse(int x, int y) {
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.dx = x;
    input.mi.dy = y;
    input.mi.time = 0;
    input.mi.dwFlags = MOUSEEVENTF_MOVE;
    UINT qwe = SendInput(1, &input, sizeof(input));
    cout<< qwe;
}

使用JNA编写Java代码

查看下面代码中的注解。

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.LONG;
import com.sun.jna.platform.win32.WinUser.INPUT;

//import static com.sun.jna.Native.sizeof;//compilation error 'sizeof(int)' has private access in 'com.sun.jna.Native'
import static com.sun.jna.platform.win32.WinUser.INPUT.INPUT_MOUSE;

public class Test {

    public static void main(String[] a) {
        moveMouse(
                1_000L,
                1_000L
        );
    }

    /**
     * @param x change required in x co-ordinate
     * @param y change required in y co-ordinate
     *
     */
    public static void moveMouse(Long x, Long y) {
        INPUT input = new INPUT();
        input.type = new DWORD(INPUT_MOUSE);
        input.input.mi.dx = new LONG(x);
        input.input.mi.dy = new LONG(y);
        input.input.mi.time = new DWORD(0);
        input.input.mi.dwFlags = new DWORD(0x0001L);

        INPUT[] inputArray = {input};

        DWORD result = User32.INSTANCE.SendInput(new DWORD(1), inputArray, input.size());

        // sizeof (used below in the commented code) returns the compilation error
        // 'sizeof(int)' has private access in 'com.sun.jna.Native'
        // I got the idea to use sizeof from another StackOverflow post
//        DWORD result = User32.INSTANCE.SendInput(new DWORD(1), inputArray, sizeof(input));
        System.out.println("result = " + result.longValue());
        System.out.println("size = " + input.size());
    }
}

输出

result = 1
size = 40

你会看到在SendInput中,我发送的是输入变量的大小,而不是数组的大小。为了得到数组的字节大小,我想到了使用sizeof,但是,正如你在上面的注解中所看到的,你应该已经理解了为什么我不能使用它,因为我不能导入私有函数。
在执行Java代码时,鼠标不会移动一个像素。

vof42yt1

vof42yt11#

我忘了输入。没意识到这是必要的。不管怎样,这是代码-

public static void moveMouse(Long x, Long y) {
    INPUT input = new INPUT();
    input.type = new DWORD(INPUT_MOUSE);
    input.input.setType("mi");//--------------------------------------added this
    input.input.mi.dx = new LONG(x);
    input.input.mi.dy = new LONG(y);
    input.input.mi.time = new DWORD(0);
    input.input.mi.dwFlags = new DWORD(0x0001L);
    INPUT[] inputArray = {input};
    DWORD result = User32.INSTANCE.SendInput(new DWORD(1), inputArray, input.size());
}

对于任何人有这个问题,这个功能可以直接复制粘贴,它应该工作。

相关问题