检测浏览器由应用程序或用户使用c#打开新选项卡

时间:2017-05-14 21:10:56

标签: c# .net google-chrome process windows-applications

我想检测应用程序是否正在打开新选项卡。我编写了一些获取父进程ID的代码。主要思想是服务将有争议地监视默认浏览器(这里是Chrome)PID(进程ID)值,如果它发生更改,它将查找父进程的pid,无论它是由用户还是应用程序创建的。对于用户,pid将提供explorer.exe,对于应用程序,它将是另一个。当用户尚未启动浏览器并且某些应用程序尝试在浏览器中打开URL时,此代码可正常工作。

public static class ProcessExtensions
{
    private static string FindIndexedProcessName(int pid)
    {
        var processName = Process.GetProcessById(pid).ProcessName;
        var processesByName = Process.GetProcessesByName(processName);
        string processIndexdName = null;

        for (var index = 0; index < processesByName.Length; index++)
        {
            processIndexdName = index == 0 ? processName : processName + "#" + index;
            var processId = new PerformanceCounter("Process", "ID Process", processIndexdName);
            if ((int)processId.NextValue() == pid)
            {
                return processIndexdName;
            }
        }

        return processIndexdName;
    }

    private static Process FindPidFromIndexedProcessName(string indexedProcessName)
    {
        var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName);
        return Process.GetProcessById((int)parentId.NextValue());
    }

    public static Process Parent(this Process process)
    {
        return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id));
    }
}

使用

MessageBox.Show("ParentPid: " + Process.GetProcessById(pid_value).Parent().Id);

问题出现(测试镀铬) 当用户已经打开浏览器然后应用程序尝试打开新选项卡时。我的应用程序然后检测父pid为explorer.exe而不是打开浏览器的应用程序。有没有办法检测到这一点。我知道这可以通过系统级挂钩实现,但我需要一个简单的方法。请帮我。谢谢。

0 个答案:

没有答案