- 此问题在此处已有答案**:
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代码时,鼠标不会移动一个像素。
1条答案
按热度按时间vof42yt11#
我忘了输入。没意识到这是必要的。不管怎样,这是代码-
对于任何人有这个问题,这个功能可以直接复制粘贴,它应该工作。