2013-04-24 31 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快捷方式。