2012-04-20 79 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

相關問題