检测Windows(IE)代理设置更改

3

我正在使用WinHttpGetIEProxyConfigForCurrentUser等函数在应用程序启动时收集当前代理信息,因为在每个请求之前这样做似乎会严重降低性能,导致某些情况下需要等待几秒钟来收集代理数据。有没有一种方法可以检测到Windows代理设置何时更改,以便我可以缓存信息直到更改发生?

谢谢, J


WinINET中没有支持的API来检测代理设置更改;代码在共享内存缓存数据库中内部设置了一个标志,所有WinINET客户端在后续请求中都会接收到该标志,但是其他客户端没有通知。像Luke建议的监视注册表键对某些情况(例如LAN代理)有效,但对于其他情况(例如VPN连接/断开)则无效。您看到的延迟可能发生在用户选择“自动检测”并且WPAD算法在您的代码中运行时。 - EricLaw
3个回答

2

不确定是否有更好的方法,但您始终可以采取核选项并使用RegNotifyChangeKeyValue和HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings


顺便提一下,这似乎基本上就是Firefox正在做的事情;他们为每个单独的HTTP请求再次读取ProxyServer注册表键。(可怕!) - EricLaw
这实际上是我一直倾向的,看起来有点“不对”,但如果“正确”的方法会减慢您的应用程序,我们还有什么选择? - JWood

0

你能在应用程序启动时在后台线程中运行检测吗?

我没有找到关于WinHttpGetIEProxyConfigForCurrentUser无法从非主UI线程中调用的信息。

如果应用程序需要比后台线程返回更快的WinHttpGetIEProxyConfigForCurrentUser结果,您可以再次将其阻塞,直到后台线程完成。


1
谢谢您的建议,但该应用程序会发出大量的单独请求,并在每个请求之前查询代理数据会导致延迟。我想我可以定期更新代理信息而不是将其缓存到应用程序的生命周期中,但像Firefox等应用程序立即捕捉到代理更改,因此必须有一种方法来检测它或更快地加载它。 - JWood
@JWood 个人而言,我会忽略代理在我的应用程序运行时更改的事实;我会让用户手动重启我的应用程序,如果他打算更改代理。因此,我会在应用程序启动时读取一次代理信息,并将其保持整个生命周期。 - Uwe Keim
1
这实际上是我现在正在做的,但我认为自动检测会很方便(主要是为了我加载Fiddler)。部分是我的懒惰在推动着我! - JWood
@JWood 你可以在你的应用程序中添加一个按钮来实现这个目的,或者通过命令行或配置文件传递一个轮询间隔(“每10秒”)给你的应用程序。 - Uwe Keim

0

我不确定它是否是由代理设置更改生成的,但可能有一个WM_SETTINGCHANGE消息可以处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接