При открытии диспетчера задач Windows для просмотра PID всех открытых процессов я вижу, что все открытые вкладки в моем браузере Chrome имеют свой собственный уникальный PID, однако я получаю тот же PID, независимо от того, какая вкладка в фокусе при использовании:C# Как получить уникальный PID для каждой вкладки браузера во внешнем браузере, т.е. Chrome/Firefox/IE
[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";
}
}
}
Chrome - единственный браузер, о котором я знаю, который на самом деле использует разные процессы для каждой вкладки. Большинство браузеров используют несколько потоков. Я считаю, что причина, по которой вы всегда получаете тот же процесс из GetForegroundWindow(), состоит в том, что это вернет основной процесс chrome, а не процесс для открытой вкладки. – firthh
@firthh: IE9 также является многопроцессорным. –
Хотя IE9 имеет несколько процессов, он не использует один процесс для каждой вкладки - по соображениям производительности он содержит несколько вкладок для каждого процесса. – snemarch