我正在使用C#(。NET 3.5)中的Environment.SetEnvironmentVariable方法调用,如下所示:
Environment.SetEnvironmentVariable( environmentVariable, 值, “机” );
然而,在单个测试系统(运行XP和Windows 7)上,这个单个调用需要2秒多的时间。 我figured out这可能是因为:“如果目标是User或Machine,则其他应用程序会通过Windows WM_SETTINGCHANGE消息通知设置操作。” 有没有办法将此Notification抑制到其他应用程序,以便快速设置我的环境并返回..?
请注意,我有一个组件可以设置大约20个环境变量,如果我使用上面描述的功能,则需要大约一分钟才能完成该任务。
请建议!!
答案 0 :(得分:10)
如果您使用反射器解除SetEnvironmentVariable,您将在方法的底部看到WM_SETTINGCHANGE,其中Win32调用SendMessageTimeout。句柄是HWND_BROADCAST(0xffff),因此每个顶部窗口都获取消息,超时设置为1000ms。根据msdn:
如果此参数为HWND_BROADCAST ((HWND)0xffff),消息被发送到 系统中的所有顶级窗口, 包括残疾人或隐形人士 无主的窗户。该功能没有 返回,直到每个窗口有时间 出。因此,总等待时间 可以达到uTimeout的值 乘以顶级数 窗户。
但是fuFlags参数设置为0。
SMTO_NORMAL(0x0000):通话 不阻止线程 处理其他请求时 等待函数返回。
SMTO_BLOCK(0x0001):防止 从处理任何调用线程 其他请求直到该功能 回报。
我不确定功能是否阻止。您可以尝试仅使用Win32设置变量,并仅在设置所有变量后发送广播消息。或者您可以直接访问注册表。