【问题标题】:Detect Windows (IE) proxy settings changes检测 Windows (IE) 代理设置更改
【发布时间】:2011-05-31 19:29:50
【问题描述】:

我正在使用WinHttpGetIEProxyConfigForCurrentUser 和朋友来收集当前代理信息,当我的应用程序开始这样做之前,每个请求似乎都会大大降低性能,因为它需要等待几秒钟来收集代理数据。有没有办法检测 Windows 代理设置何时发生变化,以便我可以缓存信息直到它发生变化?

谢谢, J

【问题讨论】:

  • 没有支持的 API 来检测 WinINET 中的代理设置更改;该代码在共享内存缓存数据库中内部设置了一个标志,所有 WinINET 客户端都会在后续请求中获取该标志,但不会为其他客户端显示任何通知。按照 Luke 的建议,查看注册表项将适用于某些场景(例如 LAN 代理),但不适用于其他场景(例如 VPN 附加/分离)。您看到的延迟可能是在用户选择了“自动检测”并且 WPAD 算法在您的代码中运行时发生的。

标签: c++ windows internet-explorer winapi


【解决方案1】:

不确定是否有更好的方法,但您始终可以选择核选项并将 RegNotifyChangeKeyValue 与 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings 一起使用。

【讨论】:

  • 顺便说一句,这似乎基本上是 Firefox 正在做的事情;他们为他们发出的每个 HTTP 请求再次读取 ProxyServer 注册表项。 (可怕!)
  • 这实际上是我一直倾向于的,似乎有点“错误”,但如果“正确”的做法会减慢您的应用程序的速度,我们还有什么选择?
【解决方案2】:

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

我没有发现 WinHttpGetIEProxyConfigForCurrentUser 可以从非主 UI 线程中调用。

如果应用程序需要WinHttpGetIEProxyConfigForCurrentUser 的结果比后台线程返回的速度快,你可以让它再次阻塞,直到后台线程完成。

【讨论】:

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

我不确定它是否是通过代理设置更改生成的,但您可能可以处理 WM_SETTINGCHANGE 消息。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多