根据文档 https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa, pvParam
是接收当前鼠标速度的参数,不是返回值。返回值代表是否成功。这里会返回0(失败),然后第二次调用总是将鼠标速度设置为1。
-
SPI_GETMOUSESPEED
: pvParam
是一个指向整数的点。
-
SPI_SETMOUSESPEED
: 是一个整数。
等效的C代码是:
UINT pvParam = 0;
BOOL ret = 0;
ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &pvParam, 0);
pvParam++;
ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (LPVOID)pvParam, 0);
所以你可以将其类型声明为IntPtr
:
$f=@'
[DllImport("user32.dll")]public static extern int SystemParametersInfo(
int uAction,
int uParam,
IntPtr lpvParam,
int fuWinIni
);
'@
然后创建一个IntPtr
实例接收 Integer,并从实例中读取 Integer。最后,将新值转换为新值IntPtr
并调用设置方法:
[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)