2015-07-20 67 views
0

我使用JNA调用SystemParametersInfoUSER32。这是我的JNA接口方法:JNA SystemParametersInfo设置鼠标速度返回false(不改变)

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),但它没有任何效果,并且该方法是总是返回假。

这些是我使用的标志值:

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

你能列出你使用的标志吗? (例如SPI_SETMOUSESPEED,SPIF_UPDATEINIFILE等)。 –

+0

你检查过'Native.GetLastError()'的值吗? – technomage

+0

@technomage'GetLastError'是_0_ – Jire

回答

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); 
+0

感谢您的支持!该方法仍然适用于'boolean'作为返回类型,我没有完全阅读文档。不知道关于'Pointer.createConstant'!谢谢! – Jire

+0

由于您已经为'SystemParametersInfo'添加了自己的映射,因此您可以添加一个新的函数声明,该函数声明将'int'作为第三个参数,并免除人为的指针构造。 – technomage

+1

@technomage:有些操作(比如'SPI_GETMOUSESPEED')需要一个真实的指针,并且有些操作(比如'SPI_SETMOUSESPEED')是一个整数。你能重载Java中的'SystemParametersInfo()'声明来处理这两种情况吗?我不知道。 –