1

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);

ブラウザのタブを一意に識別する方法を知っている人はいますか? さらに、ブラウザのタブの状態やフォーカスが変わったときにイベントをキャッチする方法を知っている人はいますか? 任意のブラウザ - Chrome、Firefox、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";

    }
}

}

4

1 に答える 1

3

あなたはあなたがしたいことをすることができないでしょう-少なくとも信頼できる方法ではありません。

ブラウザの実装は異なります。FireFox以前のバージョンのIEは1プロセスモデルを使用し、IE9はマルチプロセスですが、パフォーマンス上の理由からプロセスごとに複数のタブをグループ化し、Chromeはタブごとに1つのプロセスを実行します。他のブラウザ/ブラウザバージョンは、必要なことをすべて実行します(ただし、ほとんどの場合、単一プロセスです)。サポートしたいブラウザー用に特定のコードを作成する必要があり、実装の詳細をかなり深く処理することになります。

Chromeの場合、モデルはレンダリングを処理する1つの「ホストウィンドウ」です。各タブを処理するプロセスは「ワーカープロセス」であり、ホストとワーカーの間で通信が行われます... ChromeにワーカープロセスのPIDを取得するための公式APIがない場合は、気にしないでください:)

于 2012-05-11T06:35:26.090 に答える