Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#关闭谷歌chrome浏览器(仅限匿名windows)_C#_Google Chrome_Kill - Fatal编程技术网

使用C#关闭谷歌chrome浏览器(仅限匿名windows)

使用C#关闭谷歌chrome浏览器(仅限匿名windows),c#,google-chrome,kill,C#,Google Chrome,Kill,我想创建一个小程序来关闭谷歌与windows的连接 我有杀死所有chrome窗口的代码,但我不知道如何只隔离那些不知名的窗口 现行守则: Process[] proc = Process.GetProcessesByName("MyApp"); foreach (Process prs in proc) { prs.Kill(); } 我玩了一点,但没有完全成功。我能够确定哪些窗口是匿名的,从技术上来说,可

我想创建一个小程序来关闭谷歌与windows的连接

我有杀死所有chrome窗口的代码,但我不知道如何只隔离那些不知名的窗口

现行守则:

        Process[] proc = Process.GetProcessesByName("MyApp");
        foreach (Process prs in proc)
        {
            prs.Kill();
        }

我玩了一点,但没有完全成功。我能够确定哪些窗口是匿名的,从技术上来说,可以终止这个进程

然而,似乎必须杀死chrome可执行文件才能关闭实际窗口,不幸的是,这会关闭所有chrome窗口

您可以使用windows句柄获得SendKeys之类的东西来模拟Alt-F4,或者如果我没有弄错的话,.Net 4.5有一些附加的关闭例程,您可以尝试

尽管如此,下面的代码可以确定哪些窗口是chrome,哪些是匿名的。然后他们“杀死”,但它不会关闭窗口,只是杀死浏览(啊,就像Chrome所说的那样,Snap!)

        [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;
        }