C# Selenium chromedriver 隐藏Devtool控制台窗口

2023-11-12

爬取网页信息时,使用了C# + Selenium (WebDriver.dll) + chromedriver + Chrome

除了chromedriver控制台窗口(可以通过CDS.HideCommandPromptWindow = true隐藏),还有出现一个谷歌浏览器的Devtool调试工具的控制台窗口如下图:

尝试了很久没有能够通过添加启动参数的方式隐藏掉,于是尝试通过Windows窗口句柄的方式隐藏。  最终得到想要的隐藏效果。

-------------------------------------------------------------------------------------

基础知识:句柄分为:1.窗口句柄 和 2.线程句柄

本人通过System.Diagnostics.Process类只能找到线程句柄。  最初使用线程句柄作为参数,

使用 bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 隐藏窗口,

总是没有效果 ( 哭 /(ㄒoㄒ)/~~)

使用了public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);,才找到正确的窗口句柄。

如果有相同的类名lpClassName或者标题名lpWindowName,还需要通过窗口句柄找到进程PID,通过PID确定进程名称,从而正确筛选出想要隐藏的窗口。

Tips:public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName); 该方法可以找到具有相同类名lpClassName或者标题名lpWindowName的不同窗口的句柄。

---------------------------------------------------------------------------------------------------------------

 使用  C#关键代码如下:

引用命名空间

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using OpenQA.Selenium;  //需要WebDriver.dll
using OpenQA.Selenium.Chrome;  //需要WebDriver.dll

可能需要加个线程,来多次检测窗口是否创建   ,本人在Unity-MonoBehaviour -FixedUpdate()方法下使用,会多次使用

Process[] proc = Process.GetProcessesByName("conhost");
            for (int i = 0; i < proc.Length; i++)
            {

                //startTime_Devtools时本人自己定义的变量
                if (proc[i].StartTime.Ticks >= startTime_Devtools.Ticks) 
                {
                    curWindow = FindWindow("ConsoleWindowClass", null);  //通过类名查找窗口句柄
                    int pidTemp = 0;

                    if (curWindow != IntPtr.Zero)
                    {
                        GetWindowThreadProcessId(curWindow, out pidTemp);

                        //获得窗口句柄的进程PID
                        Process processTemp = Process.GetProcessById(pidTemp);  
                        if (processTemp.ProcessName == "MyChrome")  //筛选是否为合适的窗口
                        {
                            ShowWindowAsync(curWindow, 0);  //通过句柄隐藏窗口
                        }
                    }
                }
            }

/// <summary>
    /// Win32 API Imports
    /// </summary>
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    public static extern
    bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    /// <summary>
    /// 通过窗口句柄获取线程ID(TID)和进程ID(PID)
    /// </summary>
    /// <param name="hwnd">窗口句柄</param>
    /// <param name="PID">返回进程ID</param>
    /// <returns>返回线程ID</returns>
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int PID);   //获取线程ID

参考了网上很多的文章,最终实现了比较满意的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Selenium chromedriver 隐藏Devtool控制台窗口 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即

随机推荐

  • 记录qt窗口在拖动过程中出现的问题

    问题描述 在窗口拖动的过程中刚开始可以流畅的拖动窗口 但是一小会儿之后出现窗口拖不动的现象 或者按下鼠标在拖动区域内可以流畅拖动 但是按下鼠标朝一个方向拖动后 释放鼠标 按照此操作操作几次后 出现窗口拖不动的情况 但是过一会儿后窗口又可以被
  • 使用Python批量将EXCEL转为CSV文件

    今天遇到一个批量将100多个EXCEL 且每个excel中有多个sheet页 转为CSV文件的需求 同事使用wps右键逐个拆分 效率实在太慢 网上查了一下 使用pandas库中的to csv 方法可以解决这个问题 下面这段代码可以批量处理e
  • hadoop join之map side join

    在本例中 我们仍然采用上一例中的数据文件 之所以存在reduce side join 是因为在map阶段不能获取所有需要的join字段 即 同一个key对应的字段可能位于不同map中 Reduce side join是非常低效的 因为shu
  • 前端向后台传值的方式及相关注解

    文章目录 传参方式 QueryString传参 访问路径传参 form表单传参 ajax方式进行JSON传参 常用注解 RequestBody RequestParam 为前端提供接口 需要对传参方式有所熟悉 以下有几种常用的传参方式和常见
  • 连接vc显示服务器无法解释客户端请,vc服务器和客户端配置

    vc服务器和客户端配置 内容精选 换一换 当出现以下问题时 可以参考本章节排查解决 可以直接访问后端业务 但是无法通过负载均衡访问后端业务 通过私网IP可以访问负载均衡 但是公网IP无法访问负载均衡 后端服务器健康检查异常 客户端通过负载均
  • NDK与Cygwin配置

    1 Android 开发环境搭建 Android开发环境搭建不是重点 相信看此文章的很多人都已经搭建成功 这里随便概述性的说说 下载 JDK 下载 Eclipse 下载 Android SDK 启动Eclipse 安装 ADT 2 下载安装
  • java中optional 常用用法

    Java中的Optional是一个容器对象 它可以包含一个非空值 也可以为空 它的主要作用是在编写代码时避免空指针异常 java 8 中Optional的完整用法如下 1 创建Optional对象 可以通过of 方法创建一个包含非空值的Op
  • SpringCloud Ribbon(负载均衡)

    1 SpringCloud Ribbon 是一个客户端的负载均衡组件 主要提供负载均衡算法 2 Ribbon中负载均衡算法实现 AbstractLoadBalancerRule 负载均衡策略的抽象类 在该抽象类中定义了负载均衡器ILoadB
  • LDO的dropout voltage

    目录 从一个设计错误谈起 Dropout压降 从芯片内部电路结构理解dropout压降 MOS管 gt 低dropout压降的LDO 进一步降低dropout压降的方法 在系统设计中 电源管理是不可或缺的 而LDO 线性稳压器 是电源管理器
  • Vue生命周期详解

    Vue的生命周期 Vue实例有一个完整的生命周期 也就是从开始创建初女台化数据 编译模板 挂载DOM 渲染一更新一渲染 卸载等一系列过程 我们称这是Vue的生命周期 在Vue官网有这样一张图 生命周期 vue实例从创建到销毁的过程 声明周期
  • android卡刷包自制rom之添加删除,添加/删除ROM内置APP的教程

    ROM闪存软件包是Android闪存中必不可少的东西删除刷机包自带软件 但是大多数ROM闪存软件包都与许多应用程序集成在一起 其中许多不是您想要的 也没有您想要的应用程序 使用Mushroom ROM Assistant快速删除和添加APK
  • 偏最小二乘法(PLS)计算流程

    根据相关文献 将PLS的计算流程整理如下 供大家参考 1 输入样本矩阵X 输出值矩阵Y分别对X Y进行中心化处理 归一化方差 得到矩阵 E0和F 2 令n 0 3 计算矩阵En FF En 计算En FF En的最大特征根对应的单位特征向量
  • AndroidStudio会在@NonNull后面自动添加@org.jetbrains.annotations.Nullable

    今天呀在AndroidStudio 4 1中一直有个问题困扰着我 那就是AndroidStudio会在 NonNull后面自动添加 org jetbrains annotations Nullable 这 自动添加就算了还报错 每次都要删除
  • 区块链搬砖实战

    前言 相信不少币友在数字货币交易的时候都发现了 不同的交易平台不同的数字货币都存在一定的差价 这时候就引出了 搬砖的概念 搬砖的概念 由于各种因素导致各平台的虚拟货币的价格有价格差 产生了套利空间 运用平台之间价格差来谋求利益的行为俗称 搬
  • vs code终端修改字体大小以及其它样式

    1 在文件 gt 首选项 gt 设置 2 用户 gt 工作台 gt 找到settings json点击进入 3 在 settings json文件里添加需要修改的样式 terminal integrated cursorBlinking t
  • 软件资源下载链接

    1 Dreamweaver DW cs5 链接 https pan baidu com s 1kVqqpqJ 密码 9hc4 DW cc2014 链接 https pan baidu com s 1skQvBCL 密码 3kd8 DW cc
  • 数据库系统——复习总结

    数据库系统
  • cvCanny检测边缘,连通重要的非连通区域

    这个函数就是使用canny边缘检测算子检测图象的边缘 在opencv下使用这个函数之前最好将图象平滑处理一下 要不然可能检测不到边缘 检测到的边缘 这些边缘大多还不是连通区域 可以通过3 3的模板将一些相近的边缘连接起来 也可以用cvDil
  • Tesseract-OCR的配置和应用

    1 百度搜索Tesseract OCR下载 Tesseract orc setup 3 02 02 exe 要记得自己的安装目录 博主的安装路径为 C Program Files x86 Tesseract OCR 等会配置环境变量要用 如
  • C# Selenium chromedriver 隐藏Devtool控制台窗口

    爬取网页信息时 使用了C Selenium WebDriver dll chromedriver Chrome 除了chromedriver控制台窗口 可以通过CDS HideCommandPromptWindow true隐藏 还有出现一