2025年3月5日 星期三 甲辰(龙)年 月初四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

软件多开检测

时间:09-16来源:作者:点击数:45

检测是否打开多个同一软件

  • //多开检测
  • bool MultRunChecker(TSTRING strKey);
  • //多开检测
  • if (!MultRunChecker((_T("XXXXXX"))))
  • {
  • return 1;
  • }
  • bool MultRunChecker(TSTRING strKey)
  • {
  • HANDLE hMutex = CreateMutex(NULL, FALSE, strKey.c_str());
  • if (GetLastError() == ERROR_ALREADY_EXISTS)
  • {//已有实例在运行
  • //将已经运行的实例置顶
  • HWND hWnd = ::FindWindow(NULL, strKey.c_str());
  • ::SetWindowPos(hWnd, HWND_TOP, -1, -1, -1, -1, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
  • ::ShowWindow(hWnd, SW_SHOWMINIMIZED);
  • ::SetForegroundWindow(hWnd);
  • ::ShowWindow(hWnd, SW_SHOWNORMAL);
  • Sleep(10);
  • if (::GetForegroundWindow() != hWnd)
  • {//如果置顶失败,则可能是残留进程,强制终止原有进程
  • TSTRING strExe = strKey + _T(".exe");
  • DWORD Pid = GetProcessidFromName(strExe.c_str());
  • HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
  • if (hProcess)
  • {
  • if (TerminateProcess(hProcess, 0))
  • {
  • return true;
  • }
  • }
  • }
  • return false;
  • }
  • return true;
  • }
  • //获取线程ID
  • DWORD GetProcessidFromName(LPCTSTR name)
  • {
  • PROCESSENTRY32 pe;
  • DWORD id = 0;
  • HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  • pe.dwSize = sizeof(PROCESSENTRY32);
  • if (!Process32First(hSnapshot, &pe))
  • return 0;
  • while (1)
  • {
  • pe.dwSize = sizeof(PROCESSENTRY32);
  • if (Process32Next(hSnapshot, &pe) == FALSE)
  • break;
  • if (StrCmpW(pe.szExeFile, name) == 0)
  • {
  • id = pe.th32ProcessID;
  • break;
  • }
  • }
  • CloseHandle(hSnapshot);
  • return id;
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐