如何使用c#在Windows 7上设置默认浏览器?

时间:2014-07-03 15:39:22

标签: c# windows browser

我正在编写一个接收浏览器名称的方法,并将系统默认值更改为主要浏览器之一:

public static void SetSystemDefaultBrowser(string aBrowserName)
{
    if (aBrowserName.ToLower() == GetSystemDefaultBrowser().ToLower())
        return;

    switch (aBrowserName.ToLower())
    {
        case "firefox":
            Registry.ClassesRoot.OpenSubKey(@".htm", true).SetValue("", "FirefoxHTML");
            Registry.ClassesRoot.OpenSubKey(@".html", true).SetValue("", "FirefoxHTML");
            Registry.ClassesRoot.OpenSubKey(@".shtml", true).SetValue("", "FirefoxHTML");
            Registry.ClassesRoot.OpenSubKey(@".xht", true).SetValue("", "FirefoxHTML");
            Registry.ClassesRoot.OpenSubKey(@".xhtml", true).SetValue("", "FirefoxHTML");
            Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command", true).SetValue("", "firefox.exe");
            Registry.ClassesRoot.OpenSubKey(@"https\shell\open\command", true).SetValue("", "firefox.exe");
            Registry.CurrentUser.OpenSubKey(@"Software\Classes\http\shell\open\command", true).SetValue("", "firefox.exe");
            Registry.CurrentUser.OpenSubKey(@"Software\Classes\https\shell\open\command", true).SetValue("", "firefox.exe");
            Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice", true).SetValue("progId", "FirefoxURL");
            Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice", true).SetValue("progId", "FirefoxURL");
            Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoice", true).SetValue("progId", "FirefoxURL");    
            break;
        case "chrome":
            Process.Start("chrome.exe", "--make-default-browser");
            break;
        case "internetexplorer":
           // still can't figure out how to set IE as default...
    }
} 

在Chrome中,使用命令行非常简单。

在Firefox中-setDefaultBrowser选项doesn't work,所以我需要为此目的更改所有注册表项。当我使用我的Firefox方法查看默认程序后,它显示9个默认值中有4个被设置,所以第一个问题是我错过了哪些注册表项?

对于IE,那些与Firefox相同的注册表项还是有另一种方式? (shmgrate.exe OcinstallreinstallIE无法使用Win7)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

这有点矫枉过正,但它完全模拟用户使用UIAutomation并且适合我的情况,这是我的解决方案希望它可以帮助任何人:

首先,我在“默认程序”页面中运行控制面板,然后单击“设置默认程序”链接,然后从程序列表中选择所需的浏览器并单击“设为默认值”按钮(你需要尝试自己跟随......):

public static bool SetSystemDefaultBrowserWithGUI(string aBrowserName)
{
    Process.Start("control", "/name Microsoft.DefaultPrograms");
    AutomationElement defaultPrograms = GetSpecificAutomationItem("Default Programs", "Set your default programs");
    var invokePattern = defaultPrograms.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
    invokePattern.Invoke();

    AutomationElement browserItem = GetSpecificAutomationItem("Set Default Programs", aBrowserName);
    var invokePattern = browserItem.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern;
    invokePattern.AddToSelection();

    AutomationElement setButton = GetSpecificAutomationItem("Set Default Programs", "Set this program as default");
    var invokePattern = setButton.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
    invokePattern.Invoke();

    WindowPattern wpCloseForm = (WindowPattern)GetSpecificWindow("Set Default Programs").GetCurrentPattern(WindowPattern.Pattern);
    wpCloseForm.Close();
}

当然,这可以用来使任何程序成为默认程序,这是UIAutomation的一个很好的例子。 顺便说一句,这是在Windows 8上测试过的,也是有效的。

附录此处使用的函数:

public static AutomationElement GetSpecificWindow(string aWinTitle)
{
    AutomationElement mainWindow = null;
    AutomationElementCollection winCollection = AutomationElement.RootElement.FindAll(TreeScope.Children, Condition.TrueCondition);

    foreach (AutomationElement ele in winCollection)
    {
        if (ele.Current.Name.ToLower() == aWinTitle.ToLower())
        {
            mainWindow = ele;
            break;
        }
    }
    return mainWindow;
}

public static AutomationElement GetSpecificAutomationItem(string aWinTitle, string itemName)
{
    AutomationElement window = GetSpecificWindow(aWinTitle);      
    Condition condition = new PropertyCondition(AutomationElement.NameProperty, itemName);
    return window.FindFirst(TreeScope.Element | TreeScope.Descendants, condition);
}

*使用Thread.Sleep() try/catch等对自己进行优化后,所有这一切都会更好...