2013-04-24 1 views
3

Я пытаюсь в течение пары недель запускать не-поднятый веб-браузер с повышенным процессом, я пробовал разные вещи, дублируя проводник токена, используя WinSafer Apis mentioned here и различные другие методы, которые все провалились. Наконец, я решил использовать предложение Microsoft использовать Планировщик заданий для запуска приложения.Открытие веб-страницы в неэкранированном браузере с повышенным процессом 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; 
      } 


     } 

Этот метод работает, и браузер действительно запущен, не возвышенный и я смог подтвердить это, проверив столбец Elevated в диспетчере задач Windows 8.

Единственный нюанс здесь заключается в том, что браузер не запускается как самое верхнее окно, оно работает в фоновом режиме, и я думаю, что это связано с тем, что его запускают через планировщик задач.

Это вызывает у меня проблемы, особенно с современными браузерами, поскольку Windows не переключается на них при запуске страницы. Я вижу, что страница была успешно запущена в Chrome, например, во время работы в режиме Windows 8, но тот факт, что она не переключается в браузер, просто бросает вызов всей цели этого обходного пути.

Я думал об использовании SetForegroundWindow, но, к сожалению, используя URL-адрес, подобный приведенному выше примеру или через explorer.exe, 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.

Смежные вопросы