【发布时间】:2012-01-14 13:23:46
【问题描述】:
我正在尝试学习如何使用 Java 和 JNA(Java Native Access)与 Windows API 进行交互,但我遇到了障碍。我试图通过在鼠标输入流上排队鼠标事件来使鼠标做某事,并且代码有效,因为 SendInput(...) 方法返回 1 表明它已成功将事件排队,但鼠标本身确实如此没有。
我的SSCCE:
编辑: 编辑以填充 dwFlags 字段。我已经尝试了几种常量组合,它们本身或位 - 或组合仍然没有成功。再次,SendInput 方法返回 1,因为它应该建议一个正常运行的方法,但鼠标没有移动:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinUser.*;
import com.sun.jna.win32.StdCallLibrary;
public class MouseUtils {
public interface User32 extends StdCallLibrary {
public static final long MOUSEEVENTF_MOVE = 0x0001L;
public static final long MOUSEEVENTF_VIRTUALDESK = 0x4000L;
public static final long MOUSEEVENTF_ABSOLUTE = 0x8000L;
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
DWORD SendInput(DWORD dWord, INPUT[] input, int cbSize);
}
public static void main(String[] args) {
INPUT input = new INPUT();
input.type = new DWORD(INPUT.INPUT_MOUSE);
input.input.mi.dx = new LONG(500);
input.input.mi.dy = new LONG(500);
input.input.mi.mouseData = new DWORD(0);
input.input.mi.dwFlags = new DWORD(User32.MOUSEEVENTF_MOVE
| User32.MOUSEEVENTF_VIRTUALDESK | User32.MOUSEEVENTF_ABSOLUTE);
// input.input.mi.dwFlags = new DWORD(0x8000L);
input.input.mi.time = new DWORD(0);
INPUT[] inArray = {input};
int cbSize = input.size(); // mouse input struct size
DWORD nInputs = new DWORD(1); // number of inputs
DWORD result = User32.INSTANCE.SendInput(nInputs , inArray, cbSize);
System.out.println("result: " + result); // return 1 if the 1 event successfully inserted
}
}
编辑 2:
做更多的阅读,似乎我对 JNA 数组的理解是不足的,我必须从 C 数组的角度来思考,其中数组只是指向连续内存区域的指针。以后还会有更多(我希望!)。
【问题讨论】: