【问题标题】:using C# to close Google chrome incognito windows only仅使用 C# 关闭 Google chrome 隐身窗口
【发布时间】:2013-01-03 02:06:15
【问题描述】:
我想创建一个小程序来关闭谷歌隐身窗口。
我有杀死所有 chrome 窗口的代码,但我不确定如何仅隔离隐身窗口
现有代码:
Process[] proc = Process.GetProcessesByName("MyApp");
foreach (Process prs in proc)
{
prs.Kill();
}
【问题讨论】:
标签:
c#
google-chrome
kill
【解决方案1】:
我对此进行了一些尝试,但没有完全成功。我能够确定哪些窗口是隐身的,并从那里从技术上终止该进程。
但是,似乎必须杀死 chrome 可执行文件才能关闭实际窗口,不幸的是,这会关闭所有 chrome 窗口。
您可能能够获得类似 SendKeys 的东西来使用 Windows 句柄模拟 Alt-F4,或者如果我没记错的话,.Net 4.5 有一些额外的关闭例程您可以尝试。
尽管如此,这里是用于确定哪些窗口是 chrome 以及哪些是隐身窗口的代码。然后他们“杀死”,但它不会关闭窗口,只是终止浏览(Aw,Snap!正如 Chrome 所说)。
[DllImport("user32.dll")]
static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern bool CloseWindow(IntPtr hWnd);
[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hwnd);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;
private void button1_Click(object sender, EventArgs e)
{
var proc = Process.GetProcesses().OrderBy(x => x.ProcessName);
foreach (Process prs in proc)
if (prs.ProcessName == "chrome" && WmiTest(prs.Id))
{
prs.Kill();
//To test SendKeys, not working, but gives you the idea
//SetForegroundWindow(prs.Handle);
//SendKeys.Send("%({F4})");
}
}
private bool WmiTest(int processId)
{
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(string.Format("SELECT CommandLine FROM Win32_Process WHERE ProcessId = {0}", processId)))
foreach (ManagementObject mo in mos.Get())
if (mo["CommandLine"].ToString().Contains("--disable-databases"))
return true;
return false;
}