How to check if a website is open in a web browser?
I'm doing it:
Process.Start("http://www.google.com");
After the default web browser opens on the website, I want to somehow check that the website is open by the web browser and close the specicif tab with that website.
To make a button click event that will check if the website is already open, close it.
source to share
You will need to write an API to manipulate tabs in browsers other than Internet Explorer, but you can start Internet Explorer processes and list open windows / tabs like this:
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);
}
}
This is not the most efficient code, but it works for getting existing instances, creating new instances, and excluding Internet Explorer windows / tab instances. I tested it on Windows XP IE 6 through Windows 7 IE 10.
I also wrote some C ++ to get the foreground window information that you could use to read the window title and process name to determine if any tab is open:
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);
You can wrap this code in a C ++ DLL or call Windows API functions from pinvoke in C #.
This is the rough equivalent of C ++ code in 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());
}
}
}
}
You can also check this answer here: How to get URLs of open pages from Chrome and Firefox?
source to share