J'essayais ceci:

$f=@'
[DllImport("user32.dll")]public static extern int SystemParametersInfo(
    int uAction, 
    int uParam, 
    int lpvParam, 
    int fuWinIni
);
'@

$mSpeed = Add-Type -memberDefinition $f -name "mSpeed" -namespace Win32Functions -passThru
    
$get = 0x0070
$set = 0x0071
    
$srcSpeed = $mSpeed::SystemParametersInfo($get, 0, 0, 0)
    
$newSpeed = $srcSpeed + 1
    
$mSpeed::SystemParametersInfo($set, 0, $newSpeed, 0)

Mais la vitesse de la souris ne revient pas. Comment puis-je l'écrire correctement?

0
Lexxy 7 oct. 2020 à 21:09

1 réponse

Meilleure réponse

Selon la documentation, pvParam est le paramètre qui reçoit la vitesse actuelle de la souris, pas la valeur de retour. La valeur de retour indique si c'est réussi ou non. Il renverra 0 (échec) ici, puis le 2ème appel définit toujours la vitesse de la souris sur 1.

  • SPI_GETMOUSESPEED : pvParam est un point vers un entier.
  • SPI_SETMOUSESPEED : c'est un nombre entier.

Le code C équivalent est:

UINT pvParam = 0;
BOOL ret = 0;
ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &pvParam, 0);
pvParam++;
ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (LPVOID)pvParam, 0);

Vous pouvez donc déclarer son type comme IntPtr

$f=@'
[DllImport("user32.dll")]public static extern int SystemParametersInfo(
    int uAction, 
    int uParam, 
    IntPtr lpvParam, 
    int fuWinIni
);
'@

Et puis créez une instance IntPtr pour recevoir l'entier et lisez l'entier à partir de l'instance. Enfin, convertissez la nouvelle valeur en un nouveau IntPtr et appelez la méthode set :

[IntPtr]$srcSpeedPtr = [system.runtime.interopservices.marshal]::AllocHGlobal(4)

$mSpeed::SystemParametersInfo($get, 0, $srcSpeedPtr, 0)
$srcSpeed = [system.runtime.interopservices.marshal]::ReadInt32($srcSpeedPtr, 0)
echo $srcSpeed

[IntPtr]$newSpeed = [IntPtr]::new($srcSpeed + 1)
$mSpeed::SystemParametersInfo($set, 0, $newSpeed, 0)

[system.runtime.interopservices.marshal]::FreeHGlobal($srcSpeedPtr)
1
Drake Wu 8 oct. 2020 à 03:24