我在 C# (.NET 3.5) 中使用 Environment.SetEnvironmentVariable 方法调用,如下所示:
环境.SetEnvironmentVariable(
环境变量,
价值,
“机器”
);
然而,在多个测试系统(运行 XP 和 Windows 7)上,这个单一调用花费的时间远远超过 2 秒。
我想通了 http://msdn.microsoft.com/en-us/library/96xafkes.aspx这可能是因为:“如果目标是用户或机器,则其他应用程序将通过 Windows WM_SETTINGCHANGE 消息通知设置操作。”
有什么方法可以抑制对其他应用程序的通知,以便我的环境快速设置并返回..?
请注意,我有一个设置大约 20 个环境变量的组件,如果我使用上面描述的函数,大约需要一分钟才能完成该任务。
请推荐!!
如果您使用反射器反汇编 SetEnvironmentVariable,您将在方法的底部看到 WM_SETTINGCHANGE 以及对 SendMessageTimeout 的 Win32 调用。句柄是 HWND_BROADCAST (0xffff),因此每个顶级窗口都会收到消息,并且超时设置为 1000 毫秒。根据msdn:
如果该参数为HWND_BROADCAST
((HWND)0xffff),消息发送至
系统中的所有顶级窗口,
包括残疾人或隐形人
无主窗口。该功能不
返回直到每个窗口计时完毕
出去。因此,总等待时间
最大可达 uTimeout 的值
乘以顶级数
视窗。
但fuFlags参数设置为0。
SMTO_NORMAL (0x0000):调用
线程不会被阻止
处理其他请求的同时
等待函数返回。
SMTO_BLOCK (0x0001):防止
调用线程处理任何
函数执行之前的其他请求
返回。
我不确定这些功能是否会阻塞。您可以尝试仅使用 Win32 设置变量,并在设置所有变量后才发送广播消息。或者您可以直接访问注册表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)