我试图在Winforms应用程序中更改WebBrowser控件的UserAgent。 我已成功使用以下代码实现此目的:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);const int URLMON_OPTION_USERAGENT = 0x10000001;public void ChangeUserAgent()
{List<string> userAgent = new List<string>();string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

唯一的问题是这只能工作一次。当我尝试第二次运行ChangeUserAgent()方法时,它不起作用。它保持设置为第一个更改的值。这很烦人,我已经尝试了一切,但它不会改变不止一次。 有谁知道一种不同的,更灵活的方法? 谢谢     

2018-12-28 5 条评论

分享

4 个回复

为陡土

我不确定是否应该从网站上复制/粘贴,但我宁愿在这里留下答案,而不是链接。如果有人可以在评论中澄清,我将非常感激。 基本上,您必须扩展WebBrowser类。

public class ExtendedWebBrowser : WebBrowser
{bool renavigating = false;public string UserAgent { get; set; }public ExtendedWebBrowser(){DocumentCompleted += SetupBrowser;//this will cause SetupBrowser to run (we need a document object)Navigate("about:blank");}void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e){DocumentCompleted -= SetupBrowser;SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;xBrowser.BeforeNavigate2 += BeforeNavigate;DocumentCompleted += PageLoaded;}void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e){}void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,ref object postData, ref object headers, ref bool cancel){if (!string.IsNullOrEmpty(UserAgent)){if (!renavigating){headers += string.Format("User-Agent: {0}rn", UserAgent);renavigating = true;cancel = true;Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);}else{renavigating = false;}}}
}

注意:要使用上述方法,您需要向“Microsoft Internet Controls”添加COM引用。 他也提到了你的方法,并声明WebBrowser控件似乎缓存了这个用户代理字符串,因此它不会在不重新启动进程的情况下更改用户代理。     

2018-12-28 0 0

佬棠

最简单的方法:

webBrowser.Navigate("http://localhost/run.php", null, null,"User-Agent: Here Put The User Agent");

2018-12-28 0 0

才脊烽馈低

此外,该功能还有一个刷新选项(根据MSDN)。它适用于我(你应该在任何用户代理更改之前设置它)。然后问题代码可以像这样改变:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);const int URLMON_OPTION_USERAGENT = 0x10000001;
const int URLMON_OPTION_USERAGENT_REFRESH = 0x10000002;public void ChangeUserAgent()
{string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, null, 0, 0);UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

2018-12-28 0 0

呕蹿尉

我想补充@Jean Azzopardi的答案。

void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,ref object postData, ref object headers, ref bool cancel)
{// This alone is sufficient, because headers is a "Ref" parameters, and the browser seems to pick this back up.headers += string.Format("User-Agent: {0}rn", UserAgent);
}

这个解决方案最适合我。使用renavigating给我带来了其他奇怪的问题,比如浏览器内容突然消失,有时仍然得到不支持的浏览器。使用这种技术,Fiddler中的所有请求都具有正确的用户代理。     

更改WebBrowser控件的用户代理相关推荐

  1. C# webbrowser控件点击页面按钮

    用金山快盘时需要每天签到挣空间容量,一直都想写个定时程序实现,然后挂到实验室的服务器上.通过参考网上一些资料,自己动手实现一个利用webbrowser控件实现了自动点击网页按钮的功能,其实很简单的,下 ...

  2. [JavaScript]WebBrowser控件下IE版本的检测

    转载请注明原文地址:https://www.cnblogs.com/litou/p/10772272.htm 在客户端检查用户使用的浏览器类型和版本,都是根据navigator.userAgent属性 ...

  3. 强制IE浏览器或WebBrowser控件使用指定版本显示网页

    最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. 发现WebBrowser控件默认使用的版本是IE7的兼容模式.而淘宝的宝贝详细页居然对IE7的支持不是很好. 成交记 ...

  4. WebBrowser控件使用技巧分享

    原文地址为: WebBrowser控件使用技巧分享 在发布"淘宝登货员"时发现不少朋友对WebBrowser控件比较感兴趣,故在此分享一下使用心得. 首先分享一个WebBrowse ...

  5. 【转载】c#多线程使用webbrowser控件

    本来打算在完成事件中分析页面的,可是郁闷了半天,根本就没有完成处理函数的调用,搜索得到解决,在此感谢原文作者http://www.soaspx.com/dotnet/csharp/csharp_201 ...

  6. WebBrowser控件参数解释

    方法 说明 GoBack '相当于IE的"后退"按钮,使你在当前历史列表中后退一项 GoForward ' 相当于IE的"前进"按钮,使你在当前历史列表中前进一 ...

  7. c#中WebBrowser控件的使用方法

    首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...

  8. 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件

    WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗口的,那么它会生生的弹出一个IE窗口来,而不是在内部跳到该链接. 如果 ...

  9. WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系

    WebBrowser控件判断完全加载使用DocumentCompleted是有问题的,所以有人提出可以使用判断DocumentCompleted的次数和Navigated次数完全相等的方法判断是否完全 ...

最新文章

  1. Linux的常用命令!
  2. 时空AI技术:深度强化学习在智能城市领域应时空AI技术:深度强化学习在智能城市领域应用介绍...
  3. golang time 时间 加减法
  4. python input与返回值-python中使用input()函数获取用户输入值方式
  5. C语言遥控器程序,红外遥控
  6. 牛客网【每日一题】4月2日 月月查华华的手机
  7. html下移,jQuery实现元素的上移下移删除
  8. 12306 被质疑过度获取用户隐私,不授权还买不了票
  9. 计算机操作系统(第四版)第二章 习题答案
  10. 2021-11-12 应用密码学:协议、算法与C源程序(目录)
  11. android 横屏录制视频,MediaRecorder怎么在竖屏的时候录像结果是横屏录的结果
  12. 打开网络连接三种方法
  13. 旷视科技面试——算法岗
  14. 模拟城市我是市长服务器维护多久,《模拟城市我是市长》你所走过的弯路 新手常见问题...
  15. Nice UI - Hacked.io
  16. 使用Java导出Excel表格并由浏览器直接下载——基于POI框架
  17. python猫抓老鼠_利用python如何实现猫捉老鼠小游戏
  18. LeetCode每日一题——904. 水果成篮
  19. linux添加fcitx输入法,Ubuntu下轻松安装FCITX输入法
  20. 13场院士报告推动2022中国种子大会 国稻种芯百团计划行动

热门文章

  1. OpenCV长方形squares探测器的实例(附完整代码)
  2. Qt for VxWorks
  3. OpenGL linesmooth线平滑的实例
  4. 经典C语言程序100例之六一
  5. python max函数_使用'key'和lambda表达式的python max函数
  6. android 帐户管理,Android开发之帐户管理
  7. 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...
  8. 递归实现10进制转8进制,字符串数字互转,判断数组正逆向
  9. Opencms安装和配置
  10. 线性代数之矩阵逆的微分