VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2622|回复: 13

[求助] 关于SendMessageTimeout 未通知到其它进程的问题

[复制链接]
69_avatar_middle
在线会员 发表于 2015-12-17 13:11:32 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 mjy194 于 2015-12-17 13:58 编辑

写了一个小工具练手,设置环境变量,需要修改注册表,修改完注册表 系统不能及时生效,需要通知别的进程

贴一下微软的解决方案:

https://support.microsoft.com/zh-cn/kb/104011


  1. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
  2.     (LPARAM) "Environment", SMTO_ABORTIFHUNG,
  3.     5000, &dwReturnValue);
复制代码


我检查了 这个函数的返回值 是非0  函数执行成功了,但是我打开新的CMD 发现并没有 通知的别的进程 新打开的CMD 不能使用新设定的环境变量

在系统--高级--环境变量中 已经添加了,只是没有通知到别的进程。

  1. PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment");
复制代码

返回FALSE。
关于SendMessageTimeout 未通知到其它进程的问题

有遇到的朋友麻烦指点一下

另外:SetEnvironmentVariable 只能设置当前进程的环境变量  不影响user和system的环境变量




关于SendMessageTimeout 未通知到其它进程的问题

最佳答案

查看完整内容

::SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment")); 试试这样看看好用不?




上一篇:IOCP数据的发送乱问题
下一篇:SYC老大,请你指点一下
51_avatar_middle
online_admins 发表于 2015-12-17 13:11:33 | 显示全部楼层
mjy194 发表于 2015-12-20 22:23
然而今天的测试结果是  VC6上是有效的   VS2013就无效了  我去试试VS2005  相同的一句代码

::SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"));
试试这样看看好用不?
51_avatar_middle
online_admins 发表于 2015-12-17 17:48:51 | 显示全部楼层
楼主用的是 SendMessageTimeout 还是 PostMessage?
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-17 21:27:06 | 显示全部楼层
Syc 发表于 2015-12-17 17:48
楼主用的是 SendMessageTimeout 还是 PostMessage?


都尝试了, 这个消息不允许PostMessage   那个错误是这个意思
51_avatar_middle
online_admins 发表于 2015-12-18 09:48:29 | 显示全部楼层
是不是你的操作过程有问题,本身 SendMessageTimeout 发送 HWND_BROADCAST 消息是为了通知所有当前系统的顶层窗口,通知完了之后,你再新打开一个 CMD 命令行执行窗口,肯定不会被通知到这个环境变量改变了的消息,是不是这个原因呢
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-19 16:52:07 | 显示全部楼层
Syc 发表于 2015-12-18 09:48
是不是你的操作过程有问题,本身 SendMessageTimeout 发送 HWND_BROADCAST 消息是为了通知所有当前系统的顶 ...

那这句话的意思是说:因为当时我没有cmd这个窗口,所以没有接收到通知,如果我之前有有一个cmd窗口就能接收到通知,就能看到环境变量的改变?
51_avatar_middle
online_admins 发表于 2015-12-19 18:50:48 | 显示全部楼层
mjy194 发表于 2015-12-19 16:52
那这句话的意思是说:因为当时我没有cmd这个窗口,所以没有接收到通知,如果我之前有有一个cmd窗口就能接 ...

另外,也要看你是哪个程序要用这个环境变量,是否有窗口?是否能被通知到?
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-20 11:22:33 | 显示全部楼层
Syc 发表于 2015-12-19 18:50
另外,也要看你是哪个程序要用这个环境变量,是否有窗口?是否能被通知到?

但问题是 这样理解并不符合微软提供的解决方案啊 关于SendMessageTimeout 未通知到其它进程的问题
51_avatar_middle
online_admins 发表于 2015-12-20 18:05:12 | 显示全部楼层
mjy194 发表于 2015-12-20 11:22
但问题是 这样理解并不符合微软提供的解决方案啊

这个资料发给我下,网址是多少,我研究研究
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-20 21:48:04 | 显示全部楼层
Syc 发表于 2015-12-20 18:05
这个资料发给我下,网址是多少,我研究研究

我QQ上联系你了  方便的话QQ吧
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-20 22:23:10 | 显示全部楼层
Syc 发表于 2015-12-20 18:05
这个资料发给我下,网址是多少,我研究研究

然而今天的测试结果是  VC6上是有效的   VS2013就无效了  我去试试VS2005  相同的一句代码
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-22 11:04:14 | 显示全部楼层
Syc 发表于 2015-12-21 16:36
::SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"));
试试这样看看好用 ...

不好使,不知道从哪下手了。。
69_avatar_middle
ico_lz  楼主| 发表于 2015-12-23 11:30:02 | 显示全部楼层
  1. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
复制代码

在VS中要注意字节集问题:
应该使用:
  1. SendMessageTimeout(HWND_BROADCAST,  WM_SETTINGCHANGE,  0, (LPARAM)TEXT("Environment"), SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
复制代码


谢谢大家的关注!
05_avatar_middle
在线会员 发表于 2017-5-13 15:04:19 | 显示全部楼层
使用这句代码:
  1. SendMessageTimeout(HWND_BROADCAST,  WM_SETTINGCHANGE,  0, (LPARAM)TEXT("Environment"), SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
复制代码

结果是:
  1. SendMessageTimeout return:1, GetLastError:0
复制代码

看上去没有任何问题,函数也成功了,但是功能不能生效,刚设定的环境变量仍然不能用。我是VS2017。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-21 02:43

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表