如何查看网站是否已在浏览器中打开? [英] How can I check if website is already opened in a webbrowser?
问题描述
我正在这样做:
Process.Start("http://www.google.com");
打开默认的Web浏览器后,我想以某种方式检查网站是否已由Web浏览器打开,并关闭该网站的"specicif"选项卡.
After the default webbrowser is opened the website i want to check somehow that the website is opened by the webbrowser and close the specicif tab with this website.
要进行按钮单击事件,它将检查网站是否已打开,然后将其关闭.
To make a button click event that will check that if the website is already opened then close it.
推荐答案
您将需要编写API来操纵Internet Explorer之外的其他浏览器中的标签页,但是您可以启动Internet Explorer进程并枚举打开的窗口/标签页,如下所示:
You would need to write an API for manipulating tabs in other browsers besides Internet Explorer, but you could start Internet Explorer processes and enumerate 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);
}
}
这可能不是最有效的代码,但是它确实适用于获取现有实例,创建新实例以及退出Internet Explorer窗口/选项卡的实例.我通过Windows 7 IE 10在Windows XP IE 6中对其进行了测试.
This may not be the most efficient code, but it does work for getting existing instances, creating new instances, and quitting instances of Internet Explorer windows/tabs. I tested it in Windows XP IE 6 up through Windows 7 IE 10.
我还编写了一些C ++以获取前景窗口信息,您可以使用这些信息来读取窗口标题和进程名称,以确定是否打开了特定的选项卡:
I also wrote some C++ for getting the foreground window information which you could use to read the window title and process name to determine if a particular 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);
您可以将此代码包装在C ++ DLL中,或从C#中的pinvoke调用Windows API函数.
You could wrap this code in a C++ DLL or call the Windows API functions from pinvoke in C#.
这与C#中的C ++代码大致等效:
This is the rough equivalent of the 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 might also check out this answer here: How can I get URLs of open pages from Chrome and Firefox?
这篇关于如何查看网站是否已在浏览器中打开?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!