如何检查浏览器是否打开

2023-12-23

如何检查浏览器是否打开?我知道我可以检查进程,但有时进程正在运行,但计算机上的浏览器仍在启动。我只需要 Chrome 和 Firefox 两种浏览器。


下面的代码获取所有正在运行的进程的文件名。如果 firefox.exe 存在于返回哈希集列表中,则意味着 firefox 正在运行。

var RunningProcessPaths = ProcessFileNameFinderClass.GetAllRunningProcessFilePaths();

if (RunningProcessPaths.Contains("firefox.exe"))
{
    //firefox is running
    Debug.WriteLine("firefox is running");
}

if (RunningProcessPaths.Contains("chrome.exe"))
{
    //Google Chrome is running
    Debug.WriteLine("chrome is running");
}

助手类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

public class ProcessFileNameFinderClass
{
    public static HashSet<string> GetAllRunningProcessFilePaths()
    {
        var allProcesses = System.Diagnostics.Process.GetProcesses();
        HashSet<string> ProcessExeNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
        foreach (Process p in allProcesses)
        {
            string processExePath = GetProcessExecutablePath(p);
            ProcessExeNames.Add(System.IO.Path.GetFileName(processExePath));
        }
        return ProcessExeNames;
    }


    /// <summary>
    /// Get executable path of running process
    /// </summary>
    /// <param name="Process"></param>
    /// <returns></returns>
    public static string GetProcessExecutablePath(Process Process)
    {
        try
        {
            if (Environment.OSVersion.Version.Major >= 6)
            {
                return GetExecutablePathAboveXP(Process.Id);// this gets the process file name without running as administrator 
            }
            return Process.MainModule.FileName;// Vista and later this requires running as administrator.
        }
        catch
        {
            return "";
        }
    }

    public static string GetExecutablePathAboveXP(int ProcessId)
    {
        int MAX_PATH = 260;
        StringBuilder sb = new StringBuilder(MAX_PATH + 1);
        IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessId);
        if (hprocess != IntPtr.Zero)
        {
            try
            {
                int size = sb.Capacity;
                if (QueryFullProcessImageName(hprocess, 0, sb, ref size))
                {
                    return sb.ToString();
                }
            }
            finally
            {
                CloseHandle(hprocess);
            }
        }
        return "";
    }

    [Flags()]
    private enum ProcessAccessFlags : uint
    {
        PROCESS_ALL_ACCESS = 0x1f0fff,
        PROCESS_TERMINATE = 0x1,
        PROCESS_CREATE_THREAD = 0x2,
        PROCESS_VM_OPERATION = 0x8,
        PROCESS_VM_READ = 0x10,
        PROCESS_VM_WRITE = 0x20,
        PROCESS_DUP_HANDLE = 0x40,
        PROCESS_SET_INFORMATION = 0x200,
        PROCESS_SET_QUOTA = 0x100,
        PROCESS_QUERY_INFORMATION = 0x400,
        PROCESS_QUERY_LIMITED_INFORMATION = 0x1000,
        SYNCHRONIZE = 0x100000,
        PROCESS_CREATE_PROCESS = 0x80,
        PROCESS_SUSPEND_RESUME = 0x800
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, [Out(), MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpExeName, ref int lpdwSize);

    [DllImport("kernel32.dll")]
    private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hHandle);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查浏览器是否打开 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • Delphi 应用程序的插件系统 - bpl 与 dll?

    我正在编写delphi应用程序 它应该具有加载插件的能力 我使用 JvPluginManager 作为插件系统 管理器 现在 在新的插件向导中 他们说最好使用 bpl 类型插件而不是 dll 插件 这个解决方案与 dll 类型插件相比有什么
  • 增量求解有什么好处?

    如果 pop 完全破坏了上下文 即学到的引理 增量约束求解使用 堆栈 的目的是什么 模式 理由 我想如果我只有 1 个约束 几个 合词 最好进行单个查询 而不是 将单独帧中的合取词堆叠到堆栈上 如果我 有超过 1 个约束并决定使用增量求解
  • 如何使用 Gekko 加快优化速度?

    我的计划是优化家用电池的充电和放电 以最大限度地降低年底的电力成本 每15分钟测量一次家庭用电量 所以我在1天内有96个测量点 我想优化电池 2 天的充电和放电 以便第 1 天考虑到第 2 天的使用情况 我编写了以下代码并且它有效 from
  • new 类名(). 方法名(); VS className ref = new className();

    我遇到了我的同事在一个内部使用的代码eventListner 即 private void someActionPerformed java awt event ActionEvent evt new className methodNam
  • makefile“没有规则来创建目标”错误

    我已经研究这个问题有一段时间了 但仍然不知道出了什么问题 我的 makefile 如下所示 F90 pgf90 NETCDF DIR opt netcdf LBS L NETCDF DIR lib lnetcdff lnetcdf INCL
  • 通过交互和指南修改 ggplot2 中的图例

    df lt data frame Depth c 1 2 3 4 5 6 7 8 Var1 as factor c rep A 4 rep B 4 Var2 as factor c rep c C D 4 Value runif 8 g l
  • Eclipse 给出错误“...不是链接资源的有效位置。”

    当我尝试在 Eclipse 中为构建路径配置添加新的类路径变量 并且我添加的路径是当前工作区是其子目录的目录时 Eclipse 给出错误 C JavaStuff is not a valid location for linked reso
  • WCF DataContract - 标记成员 IsRequired=false

    我有一份合同如下 DataContract public class MyObj DataMember IsRequired true public string StrA get private set DataMember IsRequ
  • 具有非常大的 HDF5 文件的 Tensorflow-IO 数据集输入管道

    我有非常大的训练 30Gb 文件 由于我的可用 RAM 无法容纳所有数据 因此我想批量读取数据 我看到有 Tensorflow io 包实施了一种方式 https www tensorflow org io api docs python
  • 为什么Java类应该实现comparable?

    为什么是JavaComparable用过的 为什么有人要实施Comparable在课堂上 您需要实施比较的现实生活示例是什么 这是一个现实生活中的例子 注意String还实现了Comparable class Author implemen
  • 链表中的递归

    我一直在练习链表并想在其上实现递归 尽管在某些情况下我能够有效地实现它 但在其他情况下我却惨败 我想知道一种进行递归的方法 以便不必使用 while 来遍历链接列表 我已经使用递归来遍历数组 但是当我想在这种情况下做类似的事情时它失败 我在
  • Svg矩阵分解

    在 svg 中我们有方法element getCTM 它返回一个SVGMatrix as a c e b d f 0 0 1 我想从这个矩阵计算 sx sy 和旋转角度 关于这个主题有很多东西需要阅读和学习 我将给出一个基本的答案 但请注意
  • D3 - 显示/隐藏仅单击节点的文本

    我试图在单击时显示 隐藏 D3 中节点的文本 我尝试使用以下代码 var node svg selectAll node data json nodes node on click function if textShowing node
  • 如何手动更改 8086 的标志(在汇编代码中)?

    有没有办法手动更改每个标志 或者您是否必须使用一个您知道会改变它们的结果的命令 基本上我正在使用命令RCL 而且我不想一开始就得到1 所以我想改变CF到 0 我知道我可以使用如下命令 mov al 0 shl al 1 但我想知道是否有其他
  • 美国和加拿大的颜色网格单元

    我想为美国和加拿大的网格单元格着色 我的目标与这个问题非常相似 R 在地图上绘制填充的经纬度网格单元 https stackoverflow com questions 11164974 r plot filled longitude la
  • 使用 bash 在目录树中按名称查找文件

    Using bash 如何在目录树中的某处找到具有特定名称的文件pwd 更清楚地说 我想找到位于工作目录根目录中的文件 但我不知道根目录在哪里 而且我的pwd可能在根以下的任何地方 Find file txt直到根 x pwd while
  • 当我尝试对列表进行排序时,出现错误“dict”对象没有属性

    我创建列表的代码是 choices for bet in Bet objects all Here is code that skip loop if bet choice exist in choices temp choice bet
  • Keras ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=5

    我已经检查了所有解决方案 但仍然面临同样的错误 我的训练图像形状是 26721 32 32 1 我相信它是 4 维 但我不知道为什么错误显示它是 5 维 model Sequential model add Convolution2D 16
  • FastAPI 作为 Windows 服务

    我正在尝试将 FastAPI 作为 Windows 服务运行 找不到任何文档或任何文章来将 Uvicorn 作为 Windows 服务运行 我也尝试使用 NSSM 但我的 Windows 服务停止了 我设法使用 NSSM 将 FastAPI
  • 如何检查浏览器是否打开

    如何检查浏览器是否打开 我知道我可以检查进程 但有时进程正在运行 但计算机上的浏览器仍在启动 我只需要 Chrome 和 Firefox 两种浏览器 下面的代码获取所有正在运行的进程的文件名 如果 firefox exe 存在于返回哈希集列