2012-04-20 43 views
6

我有使用MSI安装程序安装的Windows窗体应用程序(C#,NET 3.5)。 在这个应用程序中,我有一个按钮,当按下时打开一个具有特定URL的浏览器。 我使用安装后C#Windows窗体不打开默认浏览器

Process.Start(url); 

打开浏览器。 这在调试时正常工作,但在安装之后,它的结果并不理想。例如。

  • 如果我安装了Just Me选项,我打开了默认的带有当前设置的 浏览器(FF)。
  • 如果我跟每个人都选择安装它,当我按下按钮 它会打开一个版本的IE有任何的我最近设置 (代理,工具栏显示等)

至于我能告诉这个问题是由安装时与应用程序关联的用户造成的。

考虑到用户可能需要代理和个人浏览器设置,并且Just Me,Everyone的选择应该由用户决定。什么是最好的课程?

我尝试使用

ProcessStartInfo.UserName = Environment.UserName 

调用的Process.Start(URL)与登录用户当前但它也需要一个密码,并要求凭据是不是一种选择。

你有没有其他的建议,我是否错误地使用了Process.Start(),在安装过程中是否有需要设置的设置,有什么我错过了?

UPDATE: 使用Process Explorer中的data_smith建议我注意到以下几点:

  • 如果我安装了每个人的应用程序将在NT AUTHORITY \ SYSTEM用户,因此未配置的浏览器下启动。
  • 如果我安装只用我的应用程序中选择它 下启动当前用户

有没有一种方法,而无需在当前用户下要求凭证,让应用程序启动(在Windows启动)甚至尽管它是为大家安装的?

UPDATE:继data_smith建议使用的ShellExecute,我能够解决的问题,并获得所需的行为的建议herehere

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

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

+0

你是否从安装程序运行你的应用程序? – ogggre 2012-04-20 13:32:39

+0

安装应用程序后立即开始,它始终在机器启动时开始。它位于系统托盘中。 – Constantin 2012-04-20 13:36:15

+2

我认为@ogggre问的是,你的应用程序是否由安装程序启动?这可能是一个“凭据”相关的问题。使用ProcExp(由SysInternals)查看您的程序的父项。 – data 2012-04-20 15:51:32

回答

1

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

//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 \“”结尾。
我不知道它为什么在那里,但我建议使用以下循环来确保密钥在正确的位置结束。

//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; 
     } 
    } 
} 
+0

正如问题中所述,问题是找不到默认浏览器,它将以当前用户的身份打开浏览器。 – Constantin 2012-04-23 10:26:03

+0

“如果我使用Everyone选项安装它,当我按下按钮时,它会打开一个IE版本,并显示我最近的任何设置(代理,工具栏显示等)。” - 据此,康斯坦丁显然发现问题与当前用户关联的默认浏览器。 – Jack 2012-04-29 22:21:12

0
using System.Diagnostics; 
using System.Windows.Forms; 

namespace WindowsFormsApplication13 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     // Add a link to the LinkLabel. 
     LinkLabel.Link link = new LinkLabel.Link(); 
     link.LinkData = "http://www.dotnetperls.com/"; 
     linkLabel1.Links.Add(link); 
    } 

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     // Send the URL to the operating system. 
     Process.Start(e.Link.LinkData as string); 
    } 
    } 
} 
+1

我已经做了一个独立的应用程序,完全这样做,它的行为如预期。只有当应用程序与安装程序捆绑在一起并为所有人安装时才会出现此问题。 – Constantin 2012-04-23 10:30:05