设置鼠标速度的JNA SystemParametersInfo返回false(不更改)

时间:2015-07-20 17:03:51

标签: java windows winapi jna

我使用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;

1 个答案:

答案 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);