Windows下C++判断当前程序是否已存在活动实例

来源:互联网 发布:智慧树网络课平台登录 编辑:程序博客网 时间:2024/06/06 19:29


直接贴代码吧,在main函数中调用即可:

头文件必不可少:

#include <windows.h> 
#include <tlhelp32.h>


实现函数:


bool isProcessExist(){    HANDLE hProcessSnap;    PROCESSENTRY32 pe32;    DWORD dwPid = 0;    int nProcCount = 0;    // 截取系统中运行进程的快照    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    if (hProcessSnap == INVALID_HANDLE_VALUE)    {        return false;    }    pe32.dwSize = sizeof(PROCESSENTRY32);    if (!Process32First(hProcessSnap, &pe32))    {        CloseHandle(hProcessSnap);          // clean the snapshot object        return false;    }    // 获取自己程序的进程名,用于比对    TCHAR szFileFullPath[_MAX_PATH] = {0};    ::GetModuleFileName(NULL, static_cast<LPTSTR>(szFileFullPath), _MAX_PATH);    int iLength = 0;    char szFullPath[_MAX_PATH] = {0};    //获取字节长度    iLength = WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, NULL, 0, NULL, NULL);    //将tchar值赋给_char    WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, szFullPath, iLength, NULL, NULL);    std::string strProcPath = szFullPath;    // 得到自身进程名    std::string szProcName = strProcPath.substr(strProcPath.find_last_of("\\") + 1);    bool bRet = false;    char szPeProcName[_MAX_PATH] = {0};    do    {        // 遍历进程快照,比对是否有同名进程        memset(szPeProcName, 0, _MAX_PATH);        // wchar 转 char*        sprintf(szPeProcName, "%ws", pe32.szExeFile );        if (0 == strcmp(szProcName.c_str(), szPeProcName))        {            dwPid = pe32.th32ProcessID;            ++nProcCount;            if (nProcCount > 1)            {                // 不止有一个进程                bRet = true;                break;            }        }    } while (Process32Next(hProcessSnap, &pe32));    CloseHandle(hProcessSnap);    return bRet;}


当有且仅有一个同名进程时返回false,大于一个时返回true,后续操作看各位的了。

0 0