如何使用C++和WinAPI检查是否有任何Web浏览器在运行?

Pol*_*hic 2 c++ firefox winapi internet-explorer google-chrome

我的应用程序必须做一些事情,但首先它必须知道计算机上的所有Web浏览器都关闭(不运行).

如何确定它们当前是否正在运行?我想所有这些都没有通用的方法,但是所有版本的Web浏览器的解决方案都很好:

  1. IE浏览器
  2. 火狐浏览器
  3. 谷歌浏览器

当然,在那次检查之后,我可以显示MessageBox "请在继续之前关闭所有网络浏览器",我不必通过程序关闭它们(我不想).

我更喜欢不使用任何额外库等的解决方案,只是基本的WinAPI/C++,如果可能的话.

Jer*_*fin 5

看起来很明显的可能性是用来FindWindow查找是否有任何打开(主)窗口.对于Chrome,您似乎需要一类"Chrome_WidgetWin_1",而FireFox则需要一类"MozillaWindowClass"和IE"IEFrame".

#include <iostream>
#include <windows.h>
#include <vector>
#include <string>

int main(){
    std::vector<std::string> names{
        "MozillaWindowClass", 
        "IEFrame",  
        "Chrome_WidgetWin_1" 
    };

    for (auto const &name : names) {
        if (NULL != FindWindow(name.c_str(), NULL)) {
            std::cout << "Please close all browsers to continue\n";
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该比搜索可执行文件的名称更可靠 - 用户重命名可执行文件要比更改它创建的主窗口类更容易.

理论上,这个(可能几乎任何类似的)对竞争条件是开放的:如果用户在您检查该浏览器后立即启动浏览器,则可能认为实际上没有浏览器在运行.