大家好,我用WinExec打开一个程序,但是用SendMessage总关不掉,#include <iostream> 
#include <windows.h> int _tmain(int argc, _TCHAR* argv[])
{
LPCSTR path = "D:\\Program Files\\tencent\\QQ\\Bin\\QQ.exe"; // Open a program according to the path above, DONE!
WinExec(path,SW_SHOWNORMAL);  // Close the window just opened, FAIL!
HWND hWnd = FindWindow(NULL, _T("QQ")); 
SendMessage(hWnd,WM_CLOSE,NULL,NULL);  return 0;
}在网上查了半天也没有解决,请高手不吝指教,谢谢!

解决方案 »

  1.   

    对了,开发环境是VS 2008. (P.S. 代码没贴好,见谅!)
      

  2.   

    创建进程快照 然后TerminateProcess
      

  3.   

    HWND hWnd = FindWindow(NULL, _T("QQ"));//这里有问题
    //第二个参数必须是的标题栏名字 一般为QQ20XX 不会是QQ
    //把它改成
    WND hWnd = FindWindow(NULL, _T("QQ20XX"));//20XX为你的QQ标题栏名字
      

  4.   

    对,QQ进程的窗口标题不一定是“qq"吧,仔细分析一下!
    另外可以直接进程里关闭进程!代码如下
    //提升权限
    bool GetDebugPriv()
    {
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;    if ( ! OpenProcessToken( GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
        {
            return false;
        }    if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
        {
            CloseHandle( hToken );
            return false;
        }    tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;    if (!AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
        {
            CloseHandle( hToken );
            return false;
        }
        CloseHandle( hToken );
        return true;
    }
    //查找进程
    DWORD FindProcess(CString strName)
    {  
        if(strName=="")
        {
            char szFileName[256];
            memset(szFileName,0,256);
            GetModuleFileName(NULL,szFileName,255);
            strName=szFileName;
            strName=strName.Right(strName.GetLength()-strName.ReverseFind('\\')-1);
        }
        char   strProcessName[256];
        memset(strProcessName,0,256);
        strcpy(strProcessName,strName);
        DWORD aProcesses[1024], cbNeeded, cbMNeeded;
        HMODULE hMods[1024];
        HANDLE hProcess;
        char szProcessName[MAX_PATH];
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )  return 0;
        for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)
        {
            hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
            EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
            GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));
            CloseHandle(hProcess);
            if(strstr(szProcessName, strProcessName))
            {
                return(aProcesses[i]);
            }
        }
        return 0;
    }
    //结束进程
    bool KillProcess(CString strName)
    {
        // When the all operation fail this function terminate the "winlogon" Process for force exit the system.
        if(strName=="")
        {
            char szFileName[256];
            memset(szFileName,0,256);
            GetModuleFileName(NULL,szFileName,255);
            strName=szFileName;
            strName=strName.Right(strName.GetLength()-strName.ReverseFind('\\')-1);
        }
           
        DWORD dwProcessId = FindProcess(strName);
        if(dwProcessId==0)
        {
            return false;
        }
        HANDLE hYourTargetProcess=::OpenProcess(PROCESS_TERMINATE,FALSE, dwProcessId );
        if(hYourTargetProcess == NULL)
        {
            return false;
        }
        else
        {
            if(TerminateProcess(hYourTargetProcess, 4))
            {
                CloseHandle(hYourTargetProcess);
                return true;
            }
            else
            {
                GetDebugPriv();
                if(TerminateProcess(hYourTargetProcess, 4))
                {
                    CloseHandle(hYourTargetProcess);
                    return true;
                }
                else
                {
                    CloseHandle(hYourTargetProcess);
                    return false;
                }
            }
        }
    }
      

  5.   

    对了,上面代码必须加入
    #include "Psapi.h"
    #pragma comment(lib,"Psapi.lib")
      

  6.   

    像楼主这种打开可执行文件的的程序,用CreateProcess拉起程序,得到进行信息,再用进程ID通过这个函数GetWindowThreadProcessId返回进行句柄比较保险.SendMessage(hWnd,WM_CLOSE,NULL,NULL);  
      

  7.   

    ShellExecute(NULL,"open","cmd.exe","/c taskkill /f /im qq.exe",NULL,SW_HIDE);
      

  8.   

    void TerminateProcessByName(CString processName)
    {
    HANDLE snapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    //--------------------------------------
    //查询进程
    //--------------------------------------
    PROCESSENTRY32  processInfo;
    CString strProcessName= "";
    DWORD  nProcessID=0;
    HANDLE processHandle;
    int nProcessTerminate=0;
    processInfo.dwSize=sizeof(PROCESSENTRY32);
    //获取第一个进程
    BOOL status=Process32First(snapShot,&processInfo);
    while(status)
    {
    //获取进程名字
    strProcessName = processInfo.szExeFile;
    //查询比较是否为要结束的进程
    if(processName.CompareNoCase(strProcessName)==0)
    {
    //获取进程ID
    nProcessID=processInfo.th32ProcessID;
    processHandle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, nProcessID );
    if(processHandle==NULL)
    {
    return;
    }
    //结束一个进程
    TerminateProcess(processHandle,0);
    }
    //获取下一个进程
    status=Process32Next(snapShot,&processInfo);
    }
    }