Powershell 和 winapi SystemParametersInfo 函数

2024-01-06

我正在尝试这个:

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

但鼠标速度没有恢复。我该如何正确地写下这个?


根据文档 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 和 winapi SystemParametersInfo 函数 的相关文章

随机推荐

  • 线程或服务

    我对 Android 上的线程和服务感到困惑 如果我必须从服务器下载一些文件 一次可能有多个文件 在这种情况下我应该选择什么 线程还是服务 在这种情况下我应该选择什么线程或服务 这不是一个 或 这是一个 和 您使用后台线程and一项服务 从
  • 以编程方式创建可同步的 Android 日历

    我开发了一个应用程序功能 可以通过应用程序创建和同步本地电话日历 现在我必须在线同步此日历 最好通过本机电话帐户 我尝试通过帐户名称和类型扩展 URI 的内容值参数 请参阅下面的 API LVL id sync account sync a
  • gnuplot 中的历史记录自动完成

    在 gnuplot 中 我输入 gnuplot gt set style data lines 然后我运行其他几行 gnuplot gt plot data traj1 dat u 1 4 u 1 6 u 1 9 u 1 11 u 1 13
  • 当我将其构建为 Android 应用程序包时,为什么我的 Android 应用程序无法运行?

    我想开始将我的应用程序发布为 AAB 我成功构建了我的构建 aab文件并决定尝试在我的手机上安装应用程序 我用下一个方法 1 使用命令从 aab 文件构建 APK 集 java jar bundletool jar build apks b
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • Android 库项目自定义构建

    我有一个遗留应用程序 需要将其拆分为一个库项目 通用代码 和两个应用程序项目 付费和免费应用程序 我不使用 Eclipse 进行开发 也不使用 Android SDK 提供 生成 的 Ant 构建 有几个原因 不同的项目目录结构 集成到构建
  • 使用java从jar作为资源播放.wav文件

    我想使用 jar 文件中的 java 代码作为资源来播放 wav 文件 我的代码是这样的 try URL defaultSound getClass getResource images ads WindowsNavigationStart
  • 如何获取HTTP 404响应的响应内容

    有没有比直接通过 tcp 访问主机更简单的方法来获取 HTTP 404 响应的内容 这是 404 响应的示例 内容如下 HTTP 1 1 404 Object Not Found Server CouchDB 1 3 0 Erlang OT
  • 连接分层模块:SystemVerilog 中的结构与接口

    在 SystemVerilog 中 分层模块可以通过简单数据类型 复杂数据类型 结构 联合等 或接口进行连接 我感兴趣的功能是将两个模块之间的所有信号聚合到一个地方 这简化了代码的维护 例如 在下面的例子中 更改 s point 的定义而不
  • 是否将指针移动到结构成员 UB 的后面?并访问它?

    看看这个片段 struct S float x y z void fn S s 0 0 0 float p s x p 2 1 if constexpr sizeof S sizeof float 3 if S has no padding
  • 复制链表中的结构

    在这里 我将结构从一个节点复制到另一个节点 但是当我遇到最后一个节点时 我将出现分段错误 因为temp clsf gt next in memcpy将指向无效位置 我该如何解决这个问题 我无法自由temp clsf因为它不是动态分配 whi
  • C# 使用递归从 List 创建 HTML 无序列表

    是否可以使用递归输出以下 HTML 无序列表 ul li 1 ul li 5 ul li 8 li li 9 li ul li li 6 li ul li li 2 li li 3 li li 4 li li 7 li ul 原始数据保存在
  • 如何按特定顺序获得电源组?

    有一些计算幂集的解决方案 但我在谷歌上找到的这些解决方案并没有按我需要的顺序给出幂集 例如 如果我想要的幂集 1 2 3 4 常见算法为我提供了一个幂集 以下顺序 1 2 1 2 3 1 3 2 3 1 2 3 4 1 4 2 4 1 2
  • Python PyInstaller 和包含图标文件

    我正在使用 PyInstaller v1 5 构建一个可执行文件 另外 我正在使用 GUI2EXE 来帮助我 我的脚本需要位于工作目录中的图标文件 icon file pics myicon ico 当我构建可执行文件时 我希望不必包含 工
  • 读取 XML 属性并获取其值

    我对这个 XML 问题很感兴趣 我有一个 XML 文件 我可以浏览该文件来查找值 一切工作正常 我可以阅读所有子节点 但我被困在这一部分 包含照片的XML部分都是相同的节点名称 除了一个属性之外 我如何指定如何根据此浏览并获取每个文件的文件
  • OpenCart 2.0:如何从结账页面删除账单详细信息

    基本上 我想从 OpenCart 2 0 的结账页面中删除 步骤 2 账单详细信息 我的网站仅接受银行存款 货到付款和商店提货作为付款方式 因此我不需要第 2 步 我该如何操作 我看过很多操作方法 但没有看到 OpenCart 2 0 的操
  • gradle > 任务:app:externalNativeBuildDebug FAILED android_gradle_build.json(没有这样的文件或目录)

    我正在尝试使用命令行从命令行构建一个android项目 gradlew app assembleDebug 但是 当我构建任务失败时 gt Task app externalNativeBuildDebug FAILED FAILURE B
  • 防止多行文本框“窃取”滚动事件

    我在 TabControl 中有一些多行文本框 选项卡控件有一个滚动条 但一旦多行文本框聚焦 滚动将滚动文本框而不是选项卡控件 有什么方法可以阻止文本框接受事件并更像普通文本框 但仍然是多行的 将 TextBox ScrollBars 属性
  • 即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序

    我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容 class UDPClient public udp socket socket udp endpoint receiver endpoint boost array
  • Powershell 和 winapi SystemParametersInfo 函数

    我正在尝试这个 f DllImport user32 dll public static extern int SystemParametersInfo int uAction int uParam int lpvParam int fuW