我写了一个程序,此程序有时不能正常退出,即屏幕上已经没了,但在task manager中还可以看到。因此,我想通过FindWindow查找此进程的主窗口,如果此窗口是隐藏的,则说明此进程没有正常退出。因此我想把此进程删掉,但我只知道此进程的主窗口的句柄,而无法得到此进程的id,请问如何才能得到。用PSAPI可以,但我想问问有没有更简单的方法。
解决立即送分。

解决方案 »

  1.   

    删除进程不是解决的办法阿一定是你的程序有问题了检查一下内存泄漏等,NEW的东东是不是都DELETE了
      

  2.   

    /*
    コッ ハ テ・FindProcessHandleAndKill
    コッハケヲトワ:クンエーソレテ軏鰈メオスエーソレヒトスフ,イ「ヌメームユ篋フノアヒタ
    ー・アセ コナ:1.0
    ヘ・ノネユニレ:2004/03/05
    キオ サリ ヨオ:ウノケヲキオサリTRUE,キァーワキオサリFALSE
    イホ ハ  1:メヤラヨキ逸ョア桄セオトエーソレオトテ﨤ニ
    ニ萢・オテ・
    モヲモテハセタ:
        BOOL ret=FindProcessHandleAndKill("1");//イ鰈メエーソレア・簧ェ1オトエーソレ
    */BOOL FindProcessHandleAndKill(const CString &cs_WndName)
    {
    HWND hWnd;
    DWORD ProcessID;
    HANDLE hProcess; hWnd=::FindWindow(NULL, cs_WndName);
    if(hWnd==NULL)//テサモミユメオスエーソレ
    {
    return FALSE;
    }
    else
    {
    if(GetWindowThreadProcessId(hWnd, &ProcessID)==0)//ハァーワ
    {
    return FALSE;
    }
    else
    {
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);
    if(hProcess==NULL)
    {
    return FALSE;
    }
    else
    {
    if(TerminateProcess(hProcess, 0))
    {
    return TRUE;
    }
    else 
    {
    return FALSE;
    }
    }
    }
    }}
      

  3.   


    /*
    コッ ハ テ・FindProcessHandleAndKillInSnapShot
    コッハケヲトワ:ヤレスフオトトレエ貔オマミユメオスヨクカィオトウフミフイ「ヌメームヒ・アヒタ
    ー・アセ コナ:1.0
    ヘ・ノネユニレ:2004/03/05
    キオ サリ ヨオ:ウノケヲキオサリTRUE,キァーワキオサリFALSE
    イホ ハ  1:メヤラヨキ逸ョア桄セオトウフミ・ネ・winword.exe"
    ニ萢・オテ・ネ郢鉷ャメサクフミミカ犧オタヤレヤヒミミ」ャトヌテエスォヨサノアヒタメサク・ラ「メ箏トハヌユ篋ッハヨサハハモテモレWin2000マオヘウ」ャメェWin98マツスフテ釗ケモミツキセカ
    モヲモテハセタ:
        FindProcessHandleAndKillInSnapShot("winword.exe");
    */
    BOOL FindProcessHandleAndKillInSnapShot(const CString &cs_sExeName)
    {
    PROCESSENTRY32 pe;
    pe.dwSize=sizeof(PROCESSENTRY32);
    HANDLE hProcess=NULL;
    HANDLE hSnapShot;
    hSnapShot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hSnapShot==NULL)
    {
    return FALSE;//cannot get the snapshot handle
    } ::Process32First(hSnapShot, &pe); do//find the assign process name
    {
    CString str;
    str=pe.szExeFile;
    if(str.CompareNoCase(cs_sExeName)==0)
    {
    hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE,pe.th32ProcessID);
    break;
    }
    }while (::Process32Next(hSnapShot, &pe));

    if(hProcess==NULL)
    {
    //return FALSE;
    }
    if(::WaitForSingleObject(hProcess, 10000)!= WAIT_OBJECT_0)
    {
    ::TerminateProcess(hProcess,0);//kill process
    } ::CloseHandle(hProcess);
    ::CloseHandle(hSnapShot);
    Sleep(5*SLEEP_TIME);
    return TRUE;
    }
      

  4.   

    谢谢:csdnzhu(我什么也不会) 
    应该这样就可以。