以下代码只能保证Win32系统中存在唯一待关闭的程序时的正确关闭和重启,未验证多个同样程序同时运行的情况。
Win64需要替换成相应的结构体或API。
//根据程序名从进程快照中获取其进程ID
DWORD FindProcess(CString strExeFileName)
{
CString strCurVersion;
CString strPath;
HANDLE hSnapShot = NULL;
DWORD dwProcID = 0;
PROCESSENTRY32 Proc;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Proc.dwSize = sizeof(PROCESSENTRY32);
if (hSnapShot != INVALID_HANDLE_VALUE)
{
if (Process32First(hSnapShot, &Proc))
{
do
{
strPath = Proc.szExeFile;
if (strPath.Find(strExeFileName) != -1)
{
dwProcID = Proc.th32ProcessID;
break;
}
} while (Process32Next(hSnapShot,&Proc));
}
CloseHandle(hSnapShot);
}
return dwProcID;
}
//通过进程ID关闭进程
void CloseProcess(DWORD dwProcID)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcID);
TerminateProcess(hProcess, 1);
CloseHandle(hProcess);
}
以下为关闭进程并重新启动的处理:
void CloseAndRestartExe(CString strExePath)
{
CString strExeName;
CStringArray strPathArr;
DWORD dwProcID = 0;
Split(strExePath, "\\", strPathArr);
strExeName = strPathArr.GetAt(strPathArr.GetUpperBound());
dwProcID = FindProcess(strExeName);
if (dwProcID > 0)
{
//先卸载程序的托盘图标,再关闭程序
HWND hWnd = NULL;
NOTIFYICONDATA notifyicon;
hWnd = FindWindow(NULL,strExeName)->m_hWnd;<span style="white-space:pre"> </span>//该方法只有在重启函数作为mfc类的方法时调用才有效,单独调用时,其返回值类型为HWND,但是为无效值
if (hWnd != NULL)
{
notifyicon.cbSize = sizeof(NOTIFYICONDATA);
notifyicon.hWnd = hWnd;
notifyicon.uID = 0;
notifyicon.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
Shell_NotifyIcon(NIM_DELETE, ¬ifyicon);
}
CloseProcess(dwProcID);
Sleep(1000);
//重启解析程序
ShellExecute(NULL,"open",strExePath,NULL,NULL,SW_SHOWDEFAULT);
}
}