这是一个获取和设置 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 值。争论 /?展示了如何在命令脚本中使用它。