You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows 10及以上版本使用dwmapi更新触摸校对数据?

触摸屏显示器映射设置静默生效方案

问题背景

  • 平板设备中,触摸屏与显示器的映射配置对应注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wisp\Pen\Digimon
  • 系统自带的MultiDigiMon.exe通过修改该注册表项并调用dwmapi.dll完成设置更新,但不想依赖该程序
  • 当前仅能通过终止dwm.exe(自动重启后加载新配置)生效,希望实现无感知的静默更新,尝试DwmFlush API无效且始终返回False

可行解决方案

1. 发送系统设置变更通知

修改注册表后,向系统广播设置变更消息,触发相关服务重新读取配置:

  • 调用SendMessageTimeoutW,向HWND_BROADCAST发送WM_SETTINGCHANGE消息,指定设置类别为"Environment":
    SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG, 5000, nullptr);
    
  • 该方式不会中断当前桌面会话,属于轻量级触发方式

2. 重置DWM合成(谨慎使用)

通过临时禁用再启用DWM合成,强制DWM重新加载配置:

BOOL isCompositionEnabled;
DwmIsCompositionEnabled(&isCompositionEnabled);
if (isCompositionEnabled) {
    DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
    DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
}
  • 注意:该操作会短暂关闭桌面特效,对用户体验有轻微影响

3. 使用触摸设备官方API直接配置(推荐)

绕过注册表修改,直接调用系统API更新触摸设备的显示器映射:

  • 调用GetTouchInputDeviceList枚举所有触摸输入设备
  • 获取目标设备的TOUCH_INPUT_DEVICE_INFO结构,修改其中的hAssociatedMonitor或szDeviceName字段,关联到目标显示器
  • 调用SetTouchInputDeviceInfo提交修改
  • 该方式是系统原生支持的配置方式,无需依赖注册表或重启进程

说明:为什么DwmFlush无效

DwmFlush仅用于刷新DWM的即时渲染队列,确保当前帧绘制完成,不会触发系统重新读取注册表中的触摸映射配置,因此无法实现设置生效的目的

内容的提问来源于stack exchange,提问作者gw5188

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:27:25