【问题标题】:How do I broadcast a WM_SETTINGCHANGE message?如何广播 WM_SETTINGCHANGE 消息?
【发布时间】:2021-04-16 05:29:59
【问题描述】:

目的是首先在我的触摸板的注册表中进行修改,然后通过发送WM_SETTINGCHANGE广播来应用它们。

这是我一直在看的链接:

https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settingchange

我要修改的注册表是:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\PrecisionTouchPad\TapsEnabled

我该如何解决这个问题?

平台为windows,编程语言首选c++。

【问题讨论】:

  • SendMessageTimeout() 使用 HWND_BROADCAST 作为窗口句柄。 Example
  • 这是您自己链接到的文档的第 2 段

标签: c++ winapi


【解决方案1】:

如您链接到的documentation 所述:

应用程序在更改系统参数时应将WM_SETTINGCHANGE 发送到所有*窗口。 (此消息不能直接发送到窗口。)要将WM_SETTINGCHANGE 消息发送到所有顶层窗口,请使用hwnd 参数设置为HWND_BROADCASTSendMessageTimeout 函数 .

...

参数

w参数

...

应用程序发送此消息时,此参数必须为NULL。

l参数

当系统作为SystemParametersInfo 调用的结果发送此消息时,lParam 是一个指向字符串的指针,该字符串指示包含已更改系统参数的区域。此参数通常不指示更改了哪个特定系统参数。 (请注意,某些应用程序发送此消息时会将lParam 设置为 NULL。)通常,当您收到此消息时,应检查并重新加载应用程序使用的所有系统参数设置。

此字符串可以是注册表项的名称或 Win.ini 文件中某个部分的名称。当字符串是注册表名称时,通常只表示注册表中的叶节点,而不是完整路径。

...

所以,例如:

DWORD_PTR res;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("TapsEnabled"), 0, 1000, &res);

【讨论】:

  • 谢谢,但 HWND_BROADCAST 只是得到'标识符“HWND”未定义'。
  • @Snakehater 唯一可能发生的情况是您的代码中缺少核心 Win32 API #includes。 #include <windows.h> 是最低要求。你有吗?
  • 不,我根本没有包含它,但现在我有未指定架构的错误位,我认为这是一个视觉工作室错误。