C# Windows 窗体在安装后不打开默认浏览器

标签 c# windows winforms

我有一个使用 MSI 安装程序安装的 Windows 窗体应用程序(C#、NET 3.5)。 在此应用程序中,我有一个按钮,按下该按钮会打开具有特定 URL 的浏览器。 我用

Process.Start(url);

打开浏览器。 这在调试时工作正常,但在安装后效果不佳。例如。

  • 如果我安装它时选择了 Just Me 选项,我将打开我的默认设置 具有当前设置的浏览器 (FF)。
  • 如果我使用 Everyone 选项安装它,当我按下按钮时 它打开了一个没有我最近设置的 IE 版本 (代理、显示的工具栏等)

据我所知,这个问题是由安装时与应用程序关联的用户引起的。

考虑到用户可能需要代理和个人浏览器设置,以及“只有我,每个人”的选择应由用户自行决定。最佳行动方案是什么?

我尝试使用当前登录用户调用 Process.Start(url)

ProcessStartInfo.UserName = Environment.UserName

但它也需要密码,要求凭据不是一种选择。

您有任何其他建议吗,我是否错误地使用了 Process.Start(),在安装过程中是否需要进行设置,是否遗漏了什么?

更新: 按照 data_smith 的建议使用 Process Explorer 我注意到以下几点:

  • 如果我为 Everyone 安装应用程序,它将在 NT 下启动 AUTHORITY\SYSTEM 用户因此是未配置的浏览器。
  • 如果我在安装应用程序时选择了“只有我”,它会在下面启动 当前用户

有没有办法在不要求凭据的情况下使应用程序在当前用户下启动(在 Windows 启动时),即使它是为所有人安装的?

更新:遵循 data_smith 使用 ShellExecute 的建议和建议 herehere我能够解决问题并获得所需的行为。

主要问题是,当安装程序完成时,应用程序是通过 Process.Start(); 启动的;这将以 NT AUTHORITY\SYSTEM 用户(安装程序运行的用户)身份启动应用程序,因此该应用程序打开的所有浏览器也将在 SYSTEM 用户下。通过使用 data_smith 的建议和上面链接的建议,我能够在当前用户下启动该过程。

计算机重新启动后,应用程序将在正确的用户下启动,因为这是通过注册表项配置的。

最佳答案

我建议访问注册表以确定默认浏览器。

//Create a registry key to read the default browser variable
RegistryKey reader = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command");
//Determine the default browser
string DefaultBrowser = (string)reader.GetValue("");

我尝试使用此代码,发现我的注册表项以“--\”%1\“”结尾。
我不知道它为什么在那里,但我建议使用以下循环来确保 key 在正确的位置结束。

//If the path starts with a ", it will end with a "
if (DefaultBrowser[0] == '"')
{
    for (int count = 1; count < DefaultBrowser.Length; count++)
    {
        if (DefaultBrowser[count] == '"')
        {
           DefaultBrowser = DefaultBrowser.Remove(count + 1);
           count = DefaultBrowser.Length + 22;
        }
    }
}
//Otherwise, the path will end with a ' '
else
{
    for (int count = 0; count < DefaultBrowser.Length; count++)
    {
        if (DefaultBrowser[count] == ' ')
        {
           DefaultBrowser = DefaultBrowser.Remove(count + 1);
           count = DefaultBrowser.Length + 22;
        }
    } 
}

关于C# Windows 窗体在安装后不打开默认浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10247214/

相关文章:

javascript - 从代码隐藏向 jQuery 函数发送动态参数

c# - 当 ShowInTaskbar = false 时将另一个进程窗口置于前台

C# 如何在命令行参数中实现破折号 "-"选项?

c# - 动态创建的 Winform 组合框都选择相同的值

c# - 持续运行的服务器

c# - 为什么 SqlParameter 名称/值构造函数将 0 视为 null?

windows - 除了从一个定义的 IP 之外,是否热阻止对 IIS 上 ASP.NET 站点中定义的 URL 的页面的访问?

windows - Windows 批处理命令中目录的通配符

c++ - 如何从 Windows 注册表中读取值

c# - 单元格值更改事件,c#