2015-07-20 62 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()'聲明來處理這兩種情況嗎?我不知道。 –