我想检测应用程序是否正在打开新选项卡。我编写了一些获取父进程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而不是打开浏览器的应用程序。有没有办法检测到这一点。我知道这可以通过系统级挂钩实现,但我需要一个简单的方法。请帮我。谢谢。