如何检查网站浏览器中是否已打开网站?

我这样做:

Process.Start("http://www.google.com"); 

在打开默认的webbrowser之后,我想以某种方式检查网站是否由webbrowser打开并关闭此网站的specicif选项卡。

要进行按钮单击事件,将检查网站是否已打开,然后关闭它。

您需要编写一个API来操作除Internet Explorer之外的其他浏览器中的选项卡,但您可以启动Internet Explorer进程并枚举打开的窗口/选项卡,如下所示:

 using SHDocVw; .... public class IEClass { List IEWindows; public IEClass() { IEWindows = new List(); } public List 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 7 IE 10在Windows XP IE 6中测试了它。

我还写了一些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?