【问题标题】:Get UserAgent for user's default browser获取用户默认浏览器的 UserAgent
【发布时间】:2012-05-07 12:09:09
【问题描述】:

我正在制作一个包含WebBrowser 元素的应用程序,我想让该应用程序显示该用户默认浏览器的用户代理。

我知道如何通过注册表项获取默认浏览器以及如何获取浏览器的用户代理,但不知道如何将两者结合起来。这可能吗?

【问题讨论】:

  • 考虑到网络浏览器可以将任何内容放入其 UserAgent 中(例如当前时间),那么我认为您实际上需要启动浏览器才能可靠地执行此操作。问题是,你为什么还想知道这个?
  • 我正在尝试让应用程序模仿用户的默认浏览器。
  • 你为什么要这样做?通常,这样做不是一个好主意。

标签: c# browser user-agent


【解决方案1】:

我要做的(当然,这有点矫枉过正)是包含一个 Web 服务器并从该 Web 服务器请求一个 URL,从而获得用户代理。

即大致包括:

  1. 在应用程序中实现 Web 服务器,例如this one
  2. WebBrowser控件调用网络服务器的本地URL(例如http://127.0.0.1:48384/test
  3. 在 Web 服务器的请求处理程序中,将用户代理存储到变量中
  4. 向最终用户显示此变量(例如,在 WinForm 应用程序的 Label 控件中,或简单地通过从网络服务器发回响应。

我已经多次成功地在我的应用程序中使用了网络服务器。一个例子是我的HTML edit control 在代码项目中。

【讨论】:

  • 抱歉,我不确定我是否知道这是如何获取默认浏览器的用户代理的?这不会返回 webbrowser 的用户代理,我设置的值。
  • 是的,这将返回 WebBrowser 控件。毕竟,既然你提到了WebBrowser 控件,我读到你想获得这个用户代理。
  • 那么您提到的WebBrowser 与您还提到的“默认浏览器”有什么关系?
  • 默认浏览器的用户代理将应用于上述WebBrowser。
【解决方案2】:

试试这个(这是一个检查浏览器是否为手持设备的简单功能)

string strUserAgent = Request.UserAgent.ToString().ToLower();
bool status = false;
if (strUserAgent != null)
{
    if (Request.Browser.IsMobileDevice == true || 
        strUserAgent.Contains("iphone") ||
        strUserAgent.Contains("blackberry") || 
        strUserAgent.Contains("mobile") ||
        strUserAgent.Contains("windows ce") || 
        strUserAgent.Contains("opera mini") ||
        strUserAgent.Contains("palm"))
    {
        status = true;
    }
}

【讨论】:

  • 这根本不是被问到的。
【解决方案3】:

这是一个获取和设置 UserAgent 的非常简单的类。

using System.Runtime.InteropServices;

public static class UserAgent
{

    [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
    private static extern int UrlMkGetSessionOption(
        int dwOption, StringBuilder pBuffer, int dwBufferLength, out int pdwBufferLength, int dwReserved);
    [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;
    const int URLMON_OPTION_URL_ENCODING = 0x10000004;

    public static string Value
    {
        get
        {
            StringBuilder builder = new StringBuilder(512);
            int returnLength;
            UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, builder, builder.Capacity, out returnLength, 0);
            string value = builder.ToString();
            return value;
        }
        set
        {
            UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, value, value.Length, 0);
        }
    }
}

当我发现 Changing the user agent of the WebBrowser control 受urlmon.dll的DLLImport启发,我查看了pinvoke.net,发现:http://pinvoke.net/default.aspx/urlmon.UrlMkGetSessionOption

调用者:

namespace GetUserAgent
{
    class Program
    {
        //  The name of the program that was started by user
        //  See: Assembly.GetEntryAssembly Method ()
        //  https://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx
        public static string ExecName
        {
            get
            {
                //  The name of the executable that was started by user
                return System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
            }
        }

        static void Main(string[] args)
        {
            foreach (string arg in args)
            {
                if ((arg == "/?")
                    || (arg == "-?")
                    || (arg == "--help"))
                {
                    Console.Out.WriteLine(
                        "For /F \"tokens=*\" %%U In ('{0}') Do Set UserAgent=%%U",
                        ExecName);
                    return;
                }
            }

            string userAgent = UserAgent.Value;
            Console.Out.WriteLine(userAgent);
        }
    }
}

这会生成 UserAgent 值。争论 /?展示了如何在命令脚本中使用它。

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 2011-05-06
    • 2011-09-27
    • 2023-03-28
    • 2017-11-30
    • 1970-01-01
    • 2020-04-12
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多