我找了一圈都没找到什么方法或命令可以判断鼠标当前是处于光标状态还是处于指针状态,我尝试过截图法,但是很可惜图片上边没有鼠标的截图,不知道还有什么方法。
网上都说的是关于JFrame里边的光标,但不是我想要的,我想要的是鼠标在windows屏幕任意位置。
有知道的麻烦留个言,感谢!
Java不直接支持指针,因此LWJGL使用缓冲区作为变通方法.这些只是包装一个可以通过对象上的方法读取和写入的内存地址.这允许您将缓冲区传递给将值写入其中的函数,以便您可以读取这些值.
这里的关键点是你实际上必须事先创建一个缓冲区来存储值.
public static double getCursorPosX(long windowID) {
DoubleBuffer posX = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, posX, null);
return posX.get(0);
}
BufferUtils.createDoubleBuffer(length)是一个创建缓冲区的实用程序函数.不同的基元有不同的缓冲区,如int,long,char,float,double等.在这种情况下,我们需要一个可以存储双精度的缓冲区.我们传递给方法的数字(1)是缓冲区应该能够存储的值的数量.我们可以使用更大的缓冲区来存储多个值,就像在数组中一样,但在这里我们只需要一个值.
get(index)方法返回给定索引处的值.我们只想读取第一个值,因此我们指定0.您还可以使用put(index,value)将值存储在缓冲区中.
注意:如果要同时获取x和y值,可能会尝试执行以下操作:
DoubleBuffer coords = BufferUtils.createDoubleBuffer(2);
glfwGetCursorPos(windowID, coords, coords);
double x = coords.get(0);
double y = coords.get(1);
但是,这不会按预期工作:它会将y值写入索引0并在索引1处留下垃圾(读取:随机)值.如果要获取两个坐标,则必须为每个坐标创建一个单独的缓冲区.
DoubleBuffer xBuffer = BufferUtils.createDoubleBuffer(1);
DoubleBuffer yBuffer = BufferUtils.createDoubleBuffer(1);
glfwGetCursorPos(windowID, xBuffer, yBuffer);
double x = xBuffer.get(0);
double y = yBuffer.get(0);
已找到
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.*;
import java.util.*;
public class Main {
public static Cursor tt;
private final Map<WinNT.HANDLE, Cursor> cursors;
private final User32 user32;
public static void main(String[] args) throws Exception {
final Main main = new Main();
tt = main.getCurrentCursor();
System.out.println(tt);
}
public Main(){
user32 = User32.INSTANCE;
cursors = loadCursors();
}
private Map<WinNT.HANDLE, Cursor> loadCursors() {
final Map<WinNT.HANDLE, Cursor> cursors = new HashMap<>();
for (final Cursor cursor : Cursor.values()) {
final Memory memory = new Memory(Native.getNativeSize(Long.class, null));
memory.setLong(0, cursor.getCode());
final Pointer resource = memory.getPointer(0);
final WinNT.HANDLE hcursor = this.user32.LoadImageA(
null, resource, WinUser.IMAGE_CURSOR, 0, 0, WinUser.LR_SHARED
);
if(hcursor == null || Native.getLastError() != 0){
throw new Error("Cursor could not be loaded: " + Native.getLastError());
}
cursors.put(hcursor, cursor);
}
return Collections.unmodifiableMap(cursors);
}
public Cursor getCurrentCursor(){
final CURSORINFO cursorinfo = new CURSORINFO();
final int success = this.user32.GetCursorInfo(cursorinfo);
if(success != 1){
throw new Error("Could not retrieve cursor info: " + Native.getLastError());
}
System.out.printf("currentPointer=%s%n", cursorinfo.hCursor);
if(cursorinfo.hCursor != null && cursors.containsKey(cursorinfo.hCursor)){
return cursors.get(cursorinfo.hCursor);
}
return null;
}
public static class CURSORINFO extends Structure {
public int cbSize;
public int flags;
public WinDef.HCURSOR hCursor;
public WinDef.POINT ptScreenPos;
public CURSORINFO() {
this.cbSize = Native.getNativeSize(CURSORINFO.class, null);
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("cbSize", "flags", "hCursor", "ptScreenPos");
}
}
public interface User32 extends com.sun.jna.Library {
User32 INSTANCE = Native.loadLibrary("User32.dll", User32.class);
int GetCursorInfo(CURSORINFO cursorinfo);
WinNT.HANDLE LoadImageA(
WinDef.HINSTANCE hinst,
Pointer lpszName,
int uType,
int cxDesired,
int cyDesired,
int fuLoad
);
}
public enum Cursor {
APPSTARTING(32650),
NORMAL(32512),
CROSS(32515),
HAND(32649),
HELP(32651),
IBEAM(32513),
NO(32648),
SIZEALL(32646),
SIZENESW(32643),
SIZENS(32645),
SIZENWSE(32642),
SIZEWE(32644),
UP(32516),
WAIT(32514),
PEN(32631),
;
private final int code;
Cursor(final int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
}