如何在Windows 10及以上版本使用dwmapi更新触摸校对数据?
触摸屏显示器映射设置静默生效方案
问题背景
- 平板设备中,触摸屏与显示器的映射配置对应注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wisp\Pen\Digimon - 系统自带的MultiDigiMon.exe通过修改该注册表项并调用dwmapi.dll完成设置更新,但不想依赖该程序
- 当前仅能通过终止dwm.exe(自动重启后加载新配置)生效,希望实现无感知的静默更新,尝试
DwmFlushAPI无效且始终返回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
相关产品推荐
相关产品推荐

