C# 如何为外部浏览器中的每个浏览器选项卡获取唯一的 PID,即.Chrome/Firefox/IE.
本文关键字:浏览器 PID 唯一 IE Chrome 获取 Firefox 选项 外部 | 更新日期: 2023-09-27 18:33:46
当打开Windows任务管理器查看所有打开的进程的PID时,我可以看到Chrome浏览器中所有打开的选项卡都有自己独特的PID,但是无论使用哪个选项卡时,我都会得到相同的PID:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
IntPtr hwnd = GetForegroundWindow();
GetWindowThreadProcessId(hwnd, out pid);
有谁知道如何唯一标识浏览器选项卡? 更进一步,有谁知道如何在浏览器选项卡更改状态或焦点时捕获事件? 任何浏览器 - 铬,火狐,IE
下面是我在前台窗口更改时捕获 WinEventHook 事件的完整代码:
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace focusWindow2
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(SystemEvents eventMin, SystemEvents eventMax, IntPtr hmodWinEventProc,
SystemEventHandler lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
delegate void SystemEventHandler(IntPtr hWinEventHook, SystemEvents @event, IntPtr hwnd, int idObject, int idChild,
uint dwEventThread, uint dwmsEventTime);
enum SystemEvents
{
ForegroundWindowChanged = 0x3 // EVENT_SYSTEM_FOREGROUND - The only flag we care about
}
IntPtr _WinEventHook;
SystemEventHandler _WinEventHookHandler;
public Form1()
{
InitializeComponent();
// Create the handler
_WinEventHookHandler = new SystemEventHandler(WinEventHook);
// Set the hook
_WinEventHook = SetWinEventHook(SystemEvents.ForegroundWindowChanged, SystemEvents.ForegroundWindowChanged,
IntPtr.Zero, _WinEventHookHandler, 0, 0, 0);
this.FormClosing += delegate
{
UnhookWinEvent(_WinEventHook);
};
}
private void WinEventHook(IntPtr hWinEventHook, SystemEvents @event, IntPtr hwnd, int idObject, int idChild,
uint dwEventThread, uint dwmsEventTime)
{
uint pid = 0;
GetWindowThreadProcessId(hwnd, out pid);
Process p = Process.GetProcessById((int)pid);
string procName = Path.GetFileName(p.ProcessName);
textBox1.Text += procName + " " + pid + "'r'n";
}
}
}
你将无法做你想做的事——至少不能以可靠的方式做。
浏览器的实现方式不同。FireFox 和较旧的 IE 版本使用单进程模型,IE9 是多进程的,但出于性能原因,每个进程分组多个选项卡,Chrome 每个选项卡执行一个进程。其他浏览器/浏览器版本可以随心所欲地做任何事情(但很可能是单进程)。您必须为要支持的浏览器编写特定的代码,并且您将处理非常深入的实现细节。
对于Chrome,iirc模型是一个处理渲染的"主机窗口"。处理每个选项卡的进程是"工作进程",主机和工作进程之间来回通信......如果Chrome没有官方API来获取工作进程的PID,那么不要打扰:)