这个是自己查询了一些文档后归纳的,应该还有其他方法,暂且列举三种方法。
1.利用互斥量Mutex,防止多开
(1.)思路:
在程序的开始中,创建一个互斥量,之后在下面的代码中判断该互斥量是否已经存在
(2.)代码:
HANDLE h_mutex = ::CreateMutex(NULL,false,"onlyone");
if(NULL==h_mutex)
{
TRANCEO("CreateMutex Error");
return false;
}
if(::GetLastError()==ERROR_ALREADY_EXISTS)
{
OutputDebugString("已经存在该进程\n");
}
2.findwindow(),查找窗口
(1.)思路:
首先给自己的主窗口设置个名字(exp:gamequeen),然后在程序启动时查看有没有该名字的窗口存在
(2.)代码:
CWnd* pPrevWnd = CWnd::FindWindow(NULL,_T("gamequeen"));
if(pPrevWnd)
{
//exist the window
pPrevWnd-> ShowWindow(SW_RESTORE);
pPrevWnd-> SetForegroundWindow();
pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();
}
3.PROCESSENTRY32,获得系统内所有进程快照
(1.)思路:
在程序初始化时,获得系统中所有进程快照(即:任务管理器中所有进程),枚举每一个进程,判断是否有该进程名存在
(2.)代码:
BOOL CQueenLobbyApp::GetProcessID(CString processName,int type)
{
//type=0 initInstance; type=1 Restart
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
//获得系统内所有进程快照
HANDLE hprocessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hprocessSnap == INVALID_HANDLE_VALUE){
return TRUE;
}
//枚举第一个进程
BOOL bProcess = Process32First(hprocessSnap,&pe32);
int nCount = 0;
while(bProcess){
//比较本程序的进程名和找到的进程名
CString szFileName(pe32.szExeFile);
if(0==szFileName.Compare(processName)){
if (0==type)
{
if (nCount>=1){
CloseHandle(hprocessSnap);
return FALSE;
}else{
nCount++;
}
}else if (1 == type)
{
if (nCount>=0){
CloseHandle(hprocessSnap);
return FALSE;
}else{
nCount++;
}
}
}
bProcess = Process32Next(hprocessSnap,&pe32);
}
CloseHandle(hprocessSnap);
return TRUE;
}
【注】:这边只是提供一个思路,具体的实现代码还需结合自己的代码环境,有其他方法,希望大家指点。