2013-04-24 30 views
3

我一直在嘗試幾個星期來從提升的過程運行非提升的web瀏覽器,我嘗試了各種各樣的東西,重複瀏覽器令牌,使用WinSafer Apis mentioned here和其他各種失敗的技術。最後,我決定使用Microsoft建議的使用Task Scheduler來運行應用程序。從提升的過程中在非提升的瀏覽器中打開網頁C#

我使用Task Scheduler Managed Wrapper,起初我試着運行explorer.exe並將url作爲命令傳遞,但是沒有起作用,所以我創建了一個虛擬可執行文件,它將使用Process.Start啓動該網站。

這裏是我創建任務:

public static void LaunchWin8BrowserThroughTaskScheduler(string sURL) 
     { 
      String RunAsUserExecPath = AppDomain.CurrentDomain.BaseDirectory + "URLLaunch.exe"; 

      String Command = string.Format("-w \"{0}\"", sURL); 

      using (TaskService ts = new TaskService()) 
      { 
       TaskDefinition td = ts.NewTask(); 
       td.RegistrationInfo.Description = "URL Launch"; 
       td.Principal.LogonType = TaskLogonType.InteractiveToken; 
       TimeTrigger trigger = new TimeTrigger(DateTime.Now.AddSeconds(2)) 
              { 
               Enabled = true, 
               EndBoundary = DateTime.Now.AddSeconds(10) 
              }; 


       td.Triggers.Add(trigger); 

       td.Actions.Add(new ExecAction(RunAsUserExecPath, Command, null)); 
       td.Settings.StartWhenAvailable = true; 
       //Delete the task after 30 secs 
       td.Settings.DeleteExpiredTaskAfter = new TimeSpan(0,0,0,30); 
       ts.RootFolder.RegisterTaskDefinition("URL Launch", td, TaskCreation.CreateOrUpdate, null, null, TaskLogonType.InteractiveToken); 

      } 

    } 

,這是代碼到我的虛擬可執行:

static void Main(string[] args) 
     { 
      if(args.Length<=1) 
       return; 

      string sCmd = args[0]; 
      string sArg = args[1]; 

      if(string.IsNullOrEmpty(sCmd)||string.IsNullOrEmpty(sArg)) 
       return; 

      switch (sCmd) 
      { 
       case "-w": 
        { 
         Process prs = Process.Start(sArg);       
        } 
        break; 
      } 


     } 

此方法的工作,並在瀏覽器確實推出非升高我可以通過檢查Windows 8的任務管理器中的Elevated列來確認。

這裏唯一的細微差別就是瀏覽器沒有作爲最頂層的窗口啓動,它在後臺運行,我認爲它與它通過任務調度程序運行的事實有關。

這會給我帶來一些問題,特別是對於現代用戶界面瀏覽器,因爲當頁面啓動時,Windows不會切換到它們。例如,在Windows 8模式下運行時,我可以看到該頁面已成功在Chrome中啓動,但它不切換到瀏覽器的事實恰恰違背了此解決方法的全部用途。

我考慮過使用SetForegroundWindow,但遺憾地運行上面的例子或通過explorer.exe的URL,Process.Start返回null

我想知道是否有人可以幫助我解決這個問題,並能夠在前臺運行瀏覽器。

問候

回答

1

我已經能夠用一個非常簡單的方法來解決這個問題。

只寫一個快捷方式文件,如TempFolder的地方,並通過Explorer.exe的喜歡這樣執行它:

public static void GoURL(string url) 
{ 
string sysPath = Environment.GetFolderPath(Environment.SpecialFolder.System); 
       string ExplorerPath = Path.Combine(Directory.GetParent(sysPath).FullName, 
                 "explorer.exe"); 
       string TempDir = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); 
       string shortcutPath = Path.Combine(TempDir, "Mylink.url"); 
       urlShortcutToTemp(url, shortcutPath); 
       System.Diagnostics.Process.Start(ExplorerPath, shortcutPath); 
} 

private static void urlShortcutToTemp(string linkUrl, string shortcutPath) 
     { 
      using (StreamWriter writer = new StreamWriter(shortcutPath)) 
      { 
       writer.WriteLine("[InternetShortcut]"); 
       writer.WriteLine("URL=" + linkUrl); 
       writer.Flush(); 
      } 
     } 

同樣的解決方案可以應用到可執行文件與LNK快捷方式。