1. 获取当前活动窗口句柄:通过 窗口取句柄() 函数获取当前用户正在操作的窗口。
  2. 获取窗口的进程ID:通过 窗口取进程句柄() 函数,根据窗口句柄找到它所属的进程ID。
  3. 获取进程的可执行文件路径:通过 进程取文件名() 函数,根据进程ID获取该进程对应的程序文件路径。
  4. 判断路径:通过判断这个路径是否包含特定浏览器(如 chrome.exe, firefox.exe, msedge.exe 等)的名称,来确认访问对象。

下面我将提供一个完整的、可直接使用的易语言代码示例,并详细解释每一步。

易语言判断网页访问对象
(图片来源网络,侵删)

完整易语言代码示例

.版本 2
.程序集 网页访问对象判断
.子程序 _启动子程序, , 公开
    ' 调用判断函数
    判断当前浏览器 ()
.子程序 判断当前浏览器
    .局部变量 活动窗口句柄, 整数型
    .局部变量 进程ID, 整数型
    .局部变量 浏览器路径, 文本型
    .局部变量 是否为浏览器, 逻辑型
    ' --- 步骤 1: 获取当前活动窗口的句柄 ---
    ' 这个函数会获取当前用户最后点击或激活的窗口的句柄。
    活动窗口句柄 = 窗口取句柄 ()
    ' 判断是否成功获取句柄
    (活动窗口句柄 = 0) 则
        信息框 (“未能获取到活动窗口句柄,请确保当前有一个窗口处于活动状态。”, 0, , )
        返回 ()
    否则
        ' 调试输出,方便查看
        输出调试文本 (“活动窗口句柄: ” + 到文本 (活动窗口句柄))
    结束如果
    ' --- 步骤 2: 根据窗口句柄获取进程ID ---
    ' 使用 Windows API 函数 GetWindowThreadProcessId 来获取拥有该窗口的进程ID。
    ' 注意:易语言的“窗口取进程句柄”函数在某些情况下可能不准确,直接调用API更可靠。
    ' 这里我们使用一个更通用的API调用方式。
    .如果真 (取窗口进程ID (活动窗口句柄, 进程ID))
        ' 调试输出
        输出调试文本 (“进程ID: ” + 到文本 (进程ID))
    .否则
        信息框 (“未能获取到进程ID。”, 0, , )
        返回 ()
    .如果结束
    ' --- 步骤 3: 根据进程ID获取进程的文件路径 ---
    ' 使用易语言内置函数,通过进程ID获取其对应的可执行文件全路径。
    浏览器路径 = 进程取文件名 (进程ID)
    ' 判断是否成功获取路径
    (取文本长度 (浏览器路径) = 0) 则
        信息框 (“未能获取到进程的文件路径。”, 0, , )
        返回 ()
    否则
        ' 调试输出
        输出调试文本 (“进程路径: ” + 浏览器路径)
    结束如果
    ' --- 步骤 4: 判断路径中是否包含浏览器名称 ---
    ' 我们判断路径的最后一个部分是否是常见的浏览器可执行文件。
    ' 为了更准确,我们只判断文件名部分。
    .子程序 取文件名, 文本型
        .参数 路径, 文本型
        .局部变量 i, 整数型
        i = 取文本长度 (路径)
        .循环判断首 (i > 0)
            .如果真 (取文本中间 (路径, i, 1) = “\”) ' 注意:反斜杠是路径分隔符
                返回 (取文本右边 (路径, 取文本长度 (路径) - i))
            .如果结束
            i = i - 1
        .循环尾 ()
        返回 (路径) ' 如果没有找到反斜杠,则整个字符串就是文件名
    .结束子程序
    .局部变量 文件名, 文本型
    文件名 = 取文件名 (浏览器路径)
    ' 定义我们关心的浏览器列表
    .如果真 (文件名 = “chrome.exe”)
        信息框 (“当前访问对象是:谷歌浏览器 (Chrome)”, 0, , )
    .否则如果真 (文件名 = “firefox.exe”)
        信息框 (“当前访问对象是:火狐浏览器 (Firefox)”, 0, , )
    .否则如果真 (文件名 = “msedge.exe”)
        信息框 (“当前访问对象是:微软浏览器 (Edge)”, 0, , )
    .否则如果真 (文件名 = “iexplore.exe”)
        信息框 (“当前访问对象是:IE浏览器 (Internet Explorer)”, 0, , )
    .否则
        信息框 (“当前活动窗口不是常见的浏览器,或是一个其他程序。”, 0, , )
    .如果结束
.子程序 取窗口进程ID, 逻辑型
    .参数 窗口句柄, 整数型
    .参数 进程ID, 整数型, , "传址"
    .局部变量 过程ID, 整数型
    .局部变量 API返回值, 整数型
    ' 声明 Windows API 函数 GetWindowThreadProcessId
    .声明 GetWindowThreadProcessId, , 公开, _stdcall, 整数型, “user32.dll”, “GetWindowThreadProcessId”, 整数型, 整数型
    ' 参数1: 窗口句柄
    ' 参数2: 用于接收进程ID的变量的地址 (传址)
    ' 调用API
    API返回值 = GetWindowThreadProcessId (窗口句柄, &过程ID)
    ' 如果API调用成功 (返回值不为0),则将获取到的进程ID赋给参数
    (API返回值 ≠ 0) 则
        进程ID = 过程ID
        返回 (真)
    否则
        返回 (假)
    结束如果
.结束子程序

代码详解

  1. _启动子程序

    • 程序的入口,直接调用我们核心的 判断当前浏览器 子程序。
  2. 判断当前浏览器 子程序

    • 活动窗口句柄 = 窗口取句柄 ()
      • 这是第一步,也是最关键的一步。窗口取句柄() 会获取当前焦点所在的窗口的句柄,如果你正在用Chrome浏览网页,这个函数就会返回Chrome浏览器窗口的句柄。
    • 取窗口进程ID (活动窗口句柄, 进程ID)
      • 一个窗口是由一个进程创建和管理的,这个自定义子程序封装了 Windows API GetWindowThreadProcessId,它的作用是根据窗口句柄找到它所属的进程ID。
      • 为什么不直接用 窗口取进程句柄()?因为 窗口取进程句柄() 返回的是进程的“模块句柄”,在某些情况下用它来获取文件名可能不如直接获取进程ID来得直接和准确。
    • 浏览器路径 = 进程取文件名 (进程ID)
      • 易语言提供了一个非常方便的内置函数 进程取文件名(),它接收一个进程ID,返回该进程对应的可执行文件的完整路径,对于Chrome,它可能会返回 C:\Program Files\Google\Chrome\Application\chrome.exe
    • 取文件名 子程序
      • 这是一个辅助函数,因为 进程取文件名() 返回的是完整路径,而我们只需要判断文件名部分(如 chrome.exe),这个函数通过从后向前查找路径分隔符 \,来提取出文件名。
    • 判断文件名
      • 我们使用一系列的 如果真...否则如果真... 语句来判断提取出的 文件名 是否等于我们已知的浏览器可执行文件名,如果匹配,就弹出信息框告知用户。
  3. 取窗口进程ID 子程序

    • 这是一个封装了Windows API的自定义函数,是整个程序的技术核心。
    • .声明 GetWindowThreadProcessId: 这行代码告诉易语言,我们要调用一个位于 user32.dll 文件中的 GetWindowThreadProcessId 函数。_stdcall 是调用约定,整数型 是返回值类型,后面跟着参数列表。
    • API返回值 = GetWindowThreadProcessId (窗口句柄, &过程ID): 这里我们调用了API,注意第二个参数 &过程ID& 符号表示“传址”,意味着API会将计算出的进程ID写入到 过程ID 这个变量所在的内存地址中。
    • (API返回值 ≠ 0): API调用成功时,会返回非零值,我们根据这个返回值来判断是否成功获取了进程ID,并设置函数的返回值(真/假)。

使用说明和注意事项

  1. 操作步骤

    易语言判断网页访问对象
    (图片来源网络,侵删)
    • 运行这个易语言程序。
    • 在程序弹出提示框之前,你需要先用鼠标点击一下你想要判断的浏览器窗口,让它成为当前活动窗口。
    • 程序会自动捕获这个活动窗口并进行判断。
  2. 局限性

    • 焦点依赖:这个方法依赖于“当前活动窗口”,如果你在浏览器中打开了标签页,但焦点在输入框或其他地方,它依然能正确判断是浏览器,但如果焦点切换到了其他软件(如记事本),它就会判断那个软件。
    • 无法判断具体网页:这个方法只能判断出“进程”,也就是浏览器程序本身,无法判断出当前正在访问的具体网址(如 www.baidu.com,要获取网址信息,需要更复杂的技术,
      • 针对特定浏览器:通过自动化库(如 Selenium for Chrome/Edge)来获取当前URL。
      • 通过Windows API Hook:这是一个非常高级的技术,需要拦截浏览器发送网络请求的API调用,难度极大。
      • 读取浏览器缓存或历史记录:这种方法效率低且不可靠。
    • 浏览器扩展/插件:某些浏览器(如Chrome)的扩展程序也可能拥有自己的窗口,如果你的焦点在扩展的弹出窗口上,程序可能会误判为“Chrome”,这是正确的,因为扩展本身就是Chrome的一部分。
  3. 扩展

    • 你可以轻松地扩展这个程序,让它支持更多的浏览器,只需在判断语句中添加更多的 .否则如果真 分支即可,
      • .否则如果真 (文件名 = "opera.exe")
      • .否则如果真 (文件名 = "qqbrowser.exe")

这个示例为你提供了一个在易语言中判断网页访问对象的坚实基础和完整解决方案。