我做了个升级程序 在主程序中我调用升级程序
WinExec("update.exe", SW_SHOW);
PostQuitMessage(WM_QUIT); //关闭主程序在升级程序中,我发现主程序没关闭,
HWND hwnd = ::FindWindow(NULL,"程序");
::SendMessage(hwnd,WM_CLOSE,0,0);
执行这个,发现程序也没关闭掉,那位高手知道办法,最好给个具体使用的示例,谢谢
WinExec("update.exe", SW_SHOW);
PostQuitMessage(WM_QUIT); //关闭主程序在升级程序中,我发现主程序没关闭,
HWND hwnd = ::FindWindow(NULL,"程序");
::SendMessage(hwnd,WM_CLOSE,0,0);
执行这个,发现程序也没关闭掉,那位高手知道办法,最好给个具体使用的示例,谢谢
这个有示例吗
如果要关闭别人,就拿到那个进程的id ,然后发送一个消息,哪个进程接收到消息后 ,exit(1);你看看,多好。当然,postmessage(quit);也可以,但是要明确把消息传递给哪个进程id。
DWORD CProcessRuntime::GetProcessId( LPCSTR lpProcessName )
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hFindProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,NULL);
if(hFindProcess == INVALID_HANDLE_VALUE)
{
return 0;
}
DWORD dwProcessId = 0;
BOOL bAction = ::Process32First(hFindProcess ,&pe32);
CHAR szBuffer[MAX_PATH] = {0};
CHAR szProcessName[MAX_PATH] = {0};
strcpy_s(szProcessName ,sizeof(szProcessName) ,lpProcessName);
_strlwr_s(szProcessName);
while (bAction)
{
bAction = ::Process32Next(hFindProcess ,&pe32);
WideCharToMultiByte(CP_ACP ,0 ,pe32.szExeFile ,-1 ,szBuffer ,1000 ,NULL ,NULL);
_strlwr_s(szBuffer);
if(!strcmp(szBuffer ,szProcessName))
{
dwProcessId = pe32.th32ProcessID;
break;
}
}
::CloseHandle(hFindProcess);
return dwProcessId;
}BOOL CProcessRuntime::CloseProcess( LPCSTR lpProcessName )
{
BOOL bIsWork = FALSE;
DWORD dwProcessId = GetProcessId(lpProcessName);
if(dwProcessId != 0)
{
HANDLE hCloseProcess = ::OpenProcess(PROCESS_TERMINATE ,FALSE ,dwProcessId);
if(hCloseProcess != INVALID_HANDLE_VALUE)
{
::TerminateProcess(hCloseProcess ,0);
::CloseHandle(hCloseProcess);
bIsWork = TRUE;
}
}
return bIsWork;
}//调用
xxxx->CloseProcess("iexplorer.exe");
如果是关闭自己 exit(0);吧
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if( hSnapshot == (HANDLE)-1 ) {
ODS("CreateToolhelp32Snapshot() Failed!\n ");
return S_FALSE;
} PROCESSENTRY32 pe;
ZeroMemory(&pe,sizeof(pe));
pe.dwSize = sizeof(pe); bool lbFind=false; BOOL bMore = Process32First(hSnapshot,&pe); while(bMore){ HANDLE hProcess = ::OpenProcess(
PROCESS_TERMINATE,
FALSE,pe.th32ProcessID); CHAR str[260], *p;
lstrcpy(str,pe.szExeFile);
p = strupr(str);
if ( lstrcmp(p, "EXCEL.EXE") ==0 ) {
TerminateProcess(hProcess,0);
ODS("Killed All Excel Process.\n");
lbFind = true;
}
bMore = Process32Next(hSnapshot,&pe);
}
CloseHandle(hSnapshot);
if ( !lbFind)
{
ODS("Not Found Excel Process.\n ");
return S_FALSE;
}
return S_OK;
}
BOOL CXXX::LookUpProcessAndKill(const vector<CString> &vecProcessName)
{
BOOL bRet = FALSE;
HANDLE SnapShot, ProcessHandle;
SHFILEINFO shSmall;
PROCESSENTRY32 ProcessInfo; SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(SnapShot != NULL)
{
ProcessInfo.dwSize = sizeof(ProcessInfo); // 设置ProcessInfo的大小
BOOL Status = Process32First(SnapShot, &ProcessInfo);
while(Status)
{
// 获取进程文件信息
SHGetFileInfo(ProcessInfo.szExeFile, 0, &shSmall, sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON); // 检测进程是否需要关闭
_wcslwr(ProcessInfo.szExeFile);
for (vector<CString>::size_type it = 0; it != vecProcessName.size(); ++ it)
{
if(!_wcsicmp(_wcslwr((wchar_t *)vecProcessName[it].GetString()), ProcessInfo.szExeFile))
{
// 获取进程句柄,强行关闭
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID);
bRet = TerminateProcess(ProcessHandle, 1);
break;
}
}
// 获取下一个进程的信息
Status = Process32Next(SnapShot, &ProcessInfo);
}
}
return bRet;
}