HWND_BROADCAST的一个用法——修改环境变量,立即通知系统

部署运行你感兴趣的模型镜像
在编程时遇到一个问题:
就是程序通过修改注册表,修改了系统的环境变量,但是不会立即生效,除非在【我的电脑】上点击右键,然后打开环境变量的窗口,点击【OK】后,才能生效。
后来用Spy++工具捕获消息,发现在点击【OK】按钮时,发送了WM_SETTINGCHANGE消息。

在网上查找原因时发现,修改了注册表之后,系统需要重启,或者向上述操作,系统才能知道注册表被修改了,之后才能生效。
如果想修改完环境变量后,立即生效,需要向系统发送消息:
 wstring szParam = _T( "Environment" );
 ::SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)szParam.c_str() );
消息的第二个参数必须是_T( "Environment" )字符串,代表是环境变量发生了改变。

测试的方法:
第一步:
修改注册表:HKEY_CURRENT_USER//Environment下的TMP值改成“F:”
然后在文件夹上面的地址栏输入%TMP%,没有响应。
按照文章开始时叙述的方法执行后,在输入%TMP%,果然生效,系统的临时文件夹改为F:了。

第二步:
修改注册表:将HKEY_CURRENT_USER//Environment下的TMP值改回原来的值,
然后发送WM_SETTINGCHANGE消息,
在文件夹的地址栏上输入%TMP%, 立即生效了。

这里WM_SETTINGCHANGE的第二个参数用"Environment"字符串,这是表明是环境变量发生了改变。如果是活动桌面改变了,这个消息的第二个参数就是别的字符串。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### ### 使用 `HWND_BROADCAST` 将所有窗口移动到屏幕原点 (0,0) 在 Windows 系统中,`HWND_BROADCAST` 是一个特殊的窗口句柄,允许应用程序将消息广播到所有顶级窗口。通过该机制,可以向所有可见窗口发送 `WM_MOVE` 消息,从而实现将所有窗口移动到屏幕坐标 (0,0) 的操作。 #### 消息广播与窗口移动实现 调用 `SendMessage` 并传入 `HWND_BROADCAST`,可以向所有顶级窗口发送指定的消息。为了将所有窗口移动到屏幕原点,需要发送 `WM_MOVE` 消息,并将 `wParam` 和 `lParam` 设置为适当的坐标值。 ```c SendMessage(HWND_BROADCAST, WM_MOVE, 0, MAKELPARAM(0, 0)); ``` 该调用会广播 `WM_MOVE` 消息,并将窗口的左上角坐标设置为 (0,0)。然而,需要注意的是,某些窗口可能不会响应广播消息,尤其是那些明确设置了消息过滤规则的窗口[^1]。 #### 注意事项与限制 尽管 `HWND_BROADCAST` 提供了一种跨窗口广播消息的机制,但其行为受到系统安全策略和窗口消息处理逻辑的限制。例如,某些系统级窗口或受保护的 UI 元素可能忽略广播消息。此外,从 Windows Vista 开始,用户界面权限隔离(UIPI)机制会阻止低完整性级别的进程向高完整性级别的窗口发送消息,这可能影响 `HWND_BROADCAST` 的有效性[^1]。 #### 代码示例 以下是一个完整的示例,展示如何使用 `HWND_BROADCAST` 将所有顶级窗口移动到屏幕原点: ```c #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 发送 WM_MOVE 消息到所有顶级窗口 SendMessage(HWND_BROADCAST, WM_MOVE, 0, MAKELPARAM(0, 0)); return 0; } ``` 该程序会广播 `WM_MOVE` 消息,尝试将所有顶级窗口移动到屏幕左上角。如果目标窗口的消息处理函数支持 `WM_MOVE` 消息,则窗口将被重新定位。 --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值