除了 Internet Explorer 之外,您还需要编写一个 API 来操作其他浏览器中的选项卡,但您可以启动 Internet Explorer 进程并枚举打开的窗口/选项卡,如下所示:
using SHDocVw;
....
public class IEClass
{
List<InternetExplorer> IEWindows;
public IEClass()
{
IEWindows = new List<InternetExplorer>();
}
public List<InternetExplorer> GetIEInstances()
{
IEWindows.Clear();
ShellWindows shellWindows = new ShellWindows();
string filename;
foreach (InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
if (filename.Equals("iexplore"))
{
IEWindows.Add(ie);
}
}
return IEWindows;
}
public bool QuitInstance(int key)
{
InternetExplorer ie = (InternetExplorer)IEWindows[key];
try
{
ie.Quit();
return true;
}
catch (Exception ex)
{
// handle any exception
}
return false;
}
public void StartInstance(string url)
{
InternetExplorer ie = new InternetExplorer();
ieInstance.Visible = true;
ieInstance.Navigate2(ref (object)url, ref Empty, ref Empty, ref Empty, ref Empty);
IEWindows.Add(ie);
}
}
这可能不是最有效的代码,但它确实适用于获取现有实例、创建新实例和退出 Internet Explorer 窗口/选项卡的实例。我在 Windows XP IE 6 到 Windows 7 IE 10 中对其进行了测试。
我还编写了一些 C++ 来获取前台窗口信息,您可以使用这些信息来读取窗口标题和进程名称,以确定特定选项卡是否打开:
HWND foregroundWindow = GetForegroundWindow();
DWORD* processID = new DWORD;
GetWindowText(foregroundWindow, buf, 255);
GetWindowThreadProcessId(foregroundWindow, processID);
DWORD p = *processID;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, p);
TCHAR szProcessName[MAX_PATH];
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
CloseHandle(hProcess);
您可以将此代码包装在 C++ DLL 中,或者从 C# 中的 pinvoke 调用 Windows API 函数。
这是 C# 中 C++ 代码的粗略等价物:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ForegroundWindowTest
{
class Program
{
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowTextLength(IntPtr hWnd);
// int GetWindowText(
// __in HWND hWnd,
// __out LPTSTR lpString,
// __in int nMaxCount
// );
[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
// DWORD GetWindowThreadProcessId(
// __in HWND hWnd,
// __out LPDWORD lpdwProcessId
// );
[DllImport("user32.dll")]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
//HANDLE WINAPI OpenProcess(
// __in DWORD dwDesiredAccess,
// __in BOOL bInheritHandle,
// __in DWORD dwProcessId
//);
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr handle);
// DWORD WINAPI GetModuleBaseName(
// __in HANDLE hProcess,
// __in_opt HMODULE hModule,
// __out LPTSTR lpBaseName,
// __in DWORD nSize
// );
[DllImport("psapi.dll")]
private static extern uint GetModuleBaseName(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize);
// DWORD WINAPI GetModuleFileNameEx(
// __in HANDLE hProcess,
// __in_opt HMODULE hModule,
// __out LPTSTR lpFilename,
// __in DWORD nSize
// );
[DllImport("psapi.dll")]
private static extern uint GetModuleFileNameEx(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize);
public static string GetTopWindowText()
{
IntPtr hWnd = GetForegroundWindow();
int length = GetWindowTextLength(hWnd);
StringBuilder text = new StringBuilder(length + 1);
GetWindowText(hWnd, text, text.Capacity);
return text.ToString();
}
public static string GetTopWindowName()
{
IntPtr hWnd = GetForegroundWindow();
uint lpdwProcessId;
GetWindowThreadProcessId(hWnd, out lpdwProcessId);
IntPtr hProcess = OpenProcess(0x0410, false, lpdwProcessId);
StringBuilder text = new StringBuilder(1000);
//GetModuleBaseName(hProcess, IntPtr.Zero, text, text.Capacity);
GetModuleFileNameEx(hProcess, IntPtr.Zero, text, text.Capacity);
CloseHandle(hProcess);
return text.ToString();
}
static void Main(string[] args)
{
while (!Console.KeyAvailable)
{
Console.WriteLine(GetTopWindowText());
Console.WriteLine(GetTopWindowName());
}
}
}
}
您还可以在此处查看此答案:如何从 Chrome 和 Firefox 获取打开页面的 URL?