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

}

C# 如何为外部浏览器中的每个浏览器选项卡获取唯一的 PID,即.Chrome/Firefox/IE.

你将无法做你想做的事——至少不能以可靠的方式做。

浏览器的实现方式不同。FireFox 和较旧的 IE 版本使用单进程模型,IE9 是多进程的,但出于性能原因,每个进程分组多个选项卡,Chrome 每个选项卡执行一个进程。其他浏览器/浏览器版本可以随心所欲地做任何事情(但很可能是单进程)。您必须为要支持的浏览器编写特定的代码,并且您将处理非常深入的实现细节。

对于Chrome,iirc模型是一个处理渲染的"主机窗口"。处理每个选项卡的进程是"工作进程",主机和工作进程之间来回通信......如果Chrome没有官方API来获取工作进程的PID,那么不要打扰:)