如何在程序中关闭另一执行程序
我做了个升级程序 在主程序中我调用升级程序
WinExec("update.exe", SW_SHOW);
PostQuitMessage(WM_QUIT); //关闭主程序
在升级程序中,我发现主程序没关闭,
HWND hwnd = ::FindWindow(NULL,"程序");
::SendMessage(hwnd,WM_CLOSE,0,0);
执行这个,发现程序也没关闭掉,那位高手知道办法,最好给个具体使用的示例,谢谢
[解决办法]
WM_CLOSE是关闭窗口的消息,实际的程序并未关闭,你再看看别的消息先.
[解决办法]
你那个窗口Find到了么??
另外,你这不是想在主程序中退出么??如果不需要考虑退出析构什么的可以直接调用exit(0)
如果你还想在升级程序中关闭主程序,你可以在启动升级程序的时候把自己的进程id传给它,在升级程序中就可以用TerminateProcess强行终止主程序
[解决办法]
查找--关闭
看另一程序有无调用的接口,比如释放内存等
[解决办法]
HWND hwnd = ::FindWindow(NULL,"程序"); 这个句柄是否为空
[解决办法]
如果要关闭自己,就写个exit(1);
如果要关闭别人,就拿到那个进程的id ,然后发送一个消息,哪个进程接收到消息后 ,exit(1);
你看看,多好。
当然,postmessage(quit);也可以,但是要明确把消息传递给哪个进程id。
[解决办法]
- C/C++ code
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");
[解决办法]
[解决办法]
暴力点就是直接杀对方进程。如下面暴力关闭Excel.
- C/C++ code
STDMETHODIMP CMyControl::KillAllExcel(){ 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;}