从提升进程c#在非提升浏览器中打开网页

本文关键字:网页 浏览器 进程 | 更新日期: 2023-09-27 18:10:32

我已经尝试了几个星期了,从一个提升的进程运行一个非提升的web浏览器,我尝试了各种各样的事情,复制资源管理器令牌,使用这里提到的WinSafer api和各种其他技术,都失败了。最后,我决定采用微软的建议,使用任务调度程序来运行应用程序。

我使用了任务调度管理包装器,起初我尝试运行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的任务管理器中的升高列来确认这一点。

这里唯一的细微差别是浏览器不是作为最顶部的窗口启动的,它是在后台运行的,我认为这与它通过任务调度程序运行的事实有关。

这给我带来了问题,特别是在现代UI浏览器上,因为当页面启动时,Windows不会切换到它们。例如,在Windows 8模式下运行时,我可以看到该页面已经在Chrome中成功启动,但它没有切换到浏览器的事实违背了这个解决方案的全部目的。

我想使用SetForegroundWindow,但遗憾的是运行一个URL像上面的例子或通过explorer.exe, Process。Start返回null

我想知道是否有人可以帮助我解决这个问题,并能够在前台运行浏览器。

从提升进程c#在非提升浏览器中打开网页

我已经用一个非常简单的方法解决了这个问题。

只要写一个快捷文件到某个地方,比如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();
            }
        }

同样的解决方案也适用于带有链接快捷键的可执行文件