You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#/.NET Framework检测Chrome多窗口中指定网站是否已打开

解决多Chrome窗口下的标签页检测与全屏切换问题

你的现有代码在单Chrome窗口下工作正常,但确实没考虑多窗口的情况——毕竟Chrome允许打开多个独立窗口,每个窗口都有自己的标签页集合。下面我来帮你修改代码,让它能遍历所有Chrome窗口的每一个标签页,找到目标网站后切换过去并全屏。

核心问题分析

原来的代码只取了第一个有标题的Chrome主窗口,忽略了其他可能存在的Chrome窗口。我们需要:

  • 枚举所有Chrome的顶层窗口(排除Chrome的后台进程,比如GPU进程、渲染进程等)
  • 对每个Chrome窗口,单独遍历它的所有标签页
  • 找到目标标题后,激活窗口、切换到对应标签并设置全屏

具体实现步骤

首先需要引入Windows API来枚举窗口(因为Process.GetProcessesByName会包含很多非窗口的Chrome进程),然后对每个窗口逐一处理:

1. 声明必要的P/Invoke方法

在你的类中添加这些Windows API调用(用于枚举窗口和判断进程归属):

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;

public class ChromeWindowHelper
{
    // Windows API:枚举所有顶层窗口
    [DllImport("user32.dll")]
    private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);

    // 枚举窗口的委托
    private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

    // Windows API:获取窗口所属的进程ID
    [DllImport("user32.dll")]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    // Windows API:设置窗口为前台窗口
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    // Windows API:判断窗口是否可见
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWindowVisible(IntPtr hWnd);

2. 修改核心方法,遍历所有Chrome窗口

接下来重写你的逻辑,让它处理多窗口:

public void CheckAndActivateTargetTab(string targetSiteName)
    {
        // 存储所有Chrome的顶层窗口句柄
        var chromeWindows = new List<IntPtr>();

        // 枚举所有顶层窗口,筛选出Chrome的可见窗口
        EnumWindows((hWnd, lParam) =>
        {
            if (IsWindowVisible(hWnd))
            {
                GetWindowThreadProcessId(hWnd, out uint processId);
                try
                {
                    var process = Process.GetProcessById((int)processId);
                    if (process.ProcessName.Equals("chrome", StringComparison.OrdinalIgnoreCase))
                    {
                        chromeWindows.Add(hWnd);
                    }
                }
                catch (ArgumentException)
                {
                    // 进程已退出,跳过
                }
            }
            return true;
        }, IntPtr.Zero);

        // 如果没有Chrome窗口,直接打开新窗口并全屏
        if (chromeWindows.Count == 0)
        {
            OpenChromeWithTargetSiteAndFullscreen(targetSiteName);
            return;
        }

        // 遍历每个Chrome窗口
        foreach (var hWnd in chromeWindows)
        {
            // 将当前窗口设为前台
            if (!SetForegroundWindow(hWnd))
                continue;
            Thread.Sleep(150); // 等待窗口激活完成

            // 切换到第一个标签页
            SendKeys.SendWait("^1");
            Thread.Sleep(100);

            // 记录第一个标签的标题,用于判断是否遍历完所有标签
            string initialTitle = GetCurrentWindowTitle(hWnd);
            string currentTitle = initialTitle;
            bool hasLooped = false;

            do
            {
                // 检查当前标签是否是目标网站
                if (currentTitle.ToLower().Contains(targetSiteName.ToLower()))
                {
                    // 切换到全屏模式
                    SendKeys.SendWait("{F11}");
                    return; // 找到目标,直接返回
                }

                // 切换到下一个标签页
                SendKeys.SendWait("^{TAB}");
                Thread.Sleep(100);

                // 更新当前标题
                currentTitle = GetCurrentWindowTitle(hWnd);

                // 判断是否回到初始标签(避免无限循环)
                if (currentTitle == initialTitle)
                {
                    if (hasLooped)
                        break; // 已经循环过一次,退出
                    hasLooped = true;
                }

            } while (true);
        }

        // 所有窗口都没找到目标,打开新标签并全屏
        OpenChromeWithTargetSiteAndFullscreen(targetSiteName);
    }

    // 辅助方法:获取当前窗口的标题(去除Chrome后缀)
    private string GetCurrentWindowTitle(IntPtr hWnd)
    {
        GetWindowThreadProcessId(hWnd, out uint processId);
        try
        {
            var process = Process.GetProcessById((int)processId);
            return process.MainWindowTitle.Replace(" - Google Chrome", "").Trim();
        }
        catch (ArgumentException)
        {
            return string.Empty;
        }
    }

    // 辅助方法:打开Chrome并加载目标网站,然后全屏
    private void OpenChromeWithTargetSiteAndFullscreen(string targetSiteName)
    {
        // 启动Chrome并打开目标网站
        Process.Start(new ProcessStartInfo("chrome.exe", targetSiteName));
        Thread.Sleep(1200); // 等待页面加载(可根据实际情况调整)

        // 切换到全屏
        SendKeys.SendWait("{F11}");
    }
}

关键改进点说明

  • 枚举所有Chrome窗口:通过EnumWindows获取所有可见的Chrome顶层窗口,避免遗漏多窗口场景
  • 窗口级别的标签遍历:对每个Chrome窗口单独处理标签页,用初始标题判断是否遍历完所有标签(防止无限循环)
  • 全屏切换:用SendKeys.SendWait("{F11}")直接触发Chrome的全屏模式,简单高效
  • 容错处理:增加了进程不存在的异常捕获,等待窗口激活的延迟时间可根据你的实际环境调整

使用示例

在你的.NET应用中调用这个方法即可:

var chromeHelper = new ChromeWindowHelper();
chromeHelper.CheckAndActivateTargetTab("你的目标网站标题关键词");

这样不管目标网站在哪个Chrome窗口的哪个标签页,都能被找到并切换到全屏模式啦~

内容的提问来源于stack exchange,提问作者Yakir Shlezinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:32:45