我正在创建一个应用程序,按下该按钮将在Chrome中打开一个新选项卡,该选项卡将指向执行另一个功能的特定页面(我使用线程,因为它需要时间来执行此页面上的功能)。然后关闭页面。我怎么能这样做?
我认为此代码可行(google.com显然不是该页面)。
var proc = Process.Start("chrome.exe", "google.com"); //open chrome tab.
Thread.Sleep(1000); //wait for the page to load and execute the function on the page
proc.Kill(); //remove tab
但是,我收到了错误:
"未处理的类型' System.InvalidOperationException' 发生在System.dll
中其他信息:无法处理请求,因为该流程已有 。退出"
同样,标签不会关闭。
答案 0 :(得分:0)
执行chrome.exe时,chrome本身会检查另一个chrome实例是否已在运行(当您只想添加新选项卡时就是这种情况)。所以新执行的chrome.exe只是向已经运行的chrome.exe发送一堆信息,用户试图访问cmdline-args给出的页面。之后,新执行的chrome.exe终止。
已经运行的chrome.exe现在为新选项卡创建一个新的子进程,这与仅通知用户交互的进程完全不同(即:你的chrome.exe实例)。
一种可能但不完全没有错误的方法是扫描打开进程列表并在通话结束后扫描新的chrome.exe进程。
但即使杀死该过程也不会关闭标签。正如您在Chrome早期可能已经注意到的那样,当网站进程崩溃时,用户会收到有关该问题的通知,并重新加载页面(新进程已启动)。
我想你必须为远程控制编写一个chrome扩展名,或者可能有一个现有的chrome api来实现你想要做的事情。
答案 1 :(得分:0)
我认为这是因为Process.Start会返回一个' null'而不是过程,因为chrome已经在运行。
proc.kill()中的null抛出异常。
试着看看这个做类似事情的问题 - Open a Chrome Tab and Close it
答案 2 :(得分:0)
您可以使用"计时器"来自Visual Studio C#的工具,它将完成你的工作 看看这段代码:
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 100;
}
int timerCounter=0;
private void timer1_Tick(object sender, EventArgs e)
{
timerCounter += 100;
if (timerCounter == 100)
{
var proc = Process.Start("chrome.exe", "google.com"); //open chrome tab.
}
if (timerCounter == 5000) //5000 = 5 minutes , like waiting time for 5 mins to execute the function on this page .
{
proc.Kill(); //remove tab
timerCounter = 0;
timer1.Stop();
}
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Start();
}
答案 3 :(得分:0)
由于您已声明可能已经存在或可能尚未运行Chrome的实例,因此这可能会导致您正在寻找的结果:
// Open chrome tab.
var proc = Process.Start("chrome.exe", "google.com");
// Wait for the page to load and execute the function on the page.
Thread.Sleep(1000);
// Check for valid running new instance of Chrome.
if (!proc.HasExited)
{
// Kill new Chrome proc.
proc.Kill();
}
else
{
// Find already running proc of Chrome.
var alreadyRunningProc = Process.GetProcessesByName("chrome.exe");
foreach (var chrome in alreadyRunningProc)
{
// Kill any already running Chrome procs.
chrome.Kill();
}
}