我使用JNA从 user32 调用 SystemParametersInfo 。这是我的JNA接口方法:
boolean SystemParametersInfo(
int uiAction,
int uiParam,
Pointer pvParam,
int fWinIni
);
以下是我如何使用它:
User32.INSTANCE.SystemParametersInfo(SPI_SETMOUSESPEED, 0,
new IntByReference(2).getPointer(),
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);
这应该将鼠标速度设置为2(满分为20),但它没有效果,并且该方法始终返回false。
这些是我使用的标志值:
private static final int SPI_GETMOUSESPEED = 0x70;
private static final int SPI_SETMOUSESPEED = 0x0071;
private static final int SPIF_UPDATEINIFILE = 0x01;
private static final int SPIF_SENDCHANGE = 0x02;
private static final int SPIF_SENDWININICHANGE = 0x02;
答案 0 :(得分:2)
SystemParametersInfo()
的返回值是BOOL
,也就是4字节int
的别名。因此,在Java端使用int
而不是boolean
作为返回值。
除此之外,SystemParametersInfo()
失败的原因是因为您没有正确传递速度值。仔细阅读SPI_SETMOUSESPEED
文档:
SPI_SETMOUSESPEED
0x0071
设置当前鼠标速度。 pvParam参数是1(最慢)和20(最快)之间的整数。值10是默认值。通常使用鼠标控制面板应用程序设置此值。
将其与SPI_GETMOUSESPEED
文档进行比较:
SPI_GETMOUSESPEED
0x0070
检索当前鼠标速度。鼠标速度根据鼠标移动的距离确定指针移动的距离。 pvParam参数必须指向一个整数,它接收的值介于1(最慢)和20(最快)之间。值10是默认值。最终用户可以使用鼠标控制面板应用程序或使用SPI_SETMOUSESPEED的应用程序设置该值。
因此,即使将pvParam
参数声明为指针,SPI_SETMOUSESPEED
也需要实际整数值,而不是指向保存值,就像您目前使用IntByReference.getPointer()
一样。在这个问题的答案中证实了这一点(尽管对于C ++,而不是Java):
Mouse speed not changing by using SPI_SETMOUSESPEED
在C / C ++中,解决方案是这样的:
SystemParametersInfo(SPI_SETMOUSESPEED, 0,
(void*)2,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);
在Java中,等价物更像是这样:
User32.INSTANCE.SystemParametersInfo(SPI_SETMOUSESPEED, 0,
Pointer.createConstant(2),
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);