我一直在嘗試幾個星期來從提升的過程運行非提升的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
。
我想知道是否有人可以幫助我解決這個問題,並能夠在前臺運行瀏覽器。
問候