【问题标题】:Powershell and winapi SystemParametersInfo functionPowershell和winapi SystemParametersInfo函数
【发布时间】:2020-10-07 18:09:29
【问题描述】:

我正在尝试这个:

$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)

但是鼠标速度没有返回。如何正确写下?

【问题讨论】:

    标签: .net powershell winapi


    【解决方案1】:

    根据documentationpvParam是接收当前鼠标速度的参数,不是返回值。返回值表示是否成功。它会在这里返回 0(失败),然后第二次调用总是将鼠标速度设置为 1。

    • SPI_GETMOUSESPEEDpvParam 是一个指向整数的点。
    • 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 并调用 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)
    

    【讨论】:

    • 嗨,@Lexxy,这个答案对你有用吗?如果对您有帮助,请随时accept
    • 是的,@Drake,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多