如果关闭一个外部程序?

kevinhcj 2011-03-24 04:08:17
大家好,我用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;
}

在网上查了半天也没有解决,请高手不吝指教,谢谢!
...全文
129 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinhcj 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iiidie 的回复:]
HWND hWnd = FindWindow(NULL, _T("QQ"));//这里有问题
//第二个参数必须是的标题栏名字 一般为QQ20XX 不会是QQ
//把它改成
WND hWnd = FindWindow(NULL, _T("QQ20XX"));//20XX为你的QQ标题栏名字
[/Quote]
这个最直接简单!

关于结束进程,我还要再学习下,谢谢大家鼎力支持。
csuyuanweiqingking 2011-03-24
  • 打赏
  • 举报
回复
创建的句柄是否有效?可能句柄是个无效的
singwhatiwanna 2011-03-24
  • 打赏
  • 举报
回复
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);
}
}
singwhatiwanna 2011-03-24
  • 打赏
  • 举报
回复
ShellExecute(NULL,"open","cmd.exe","/c taskkill /f /im qq.exe",NULL,SW_HIDE);
Simao 2011-03-24
  • 打赏
  • 举报
回复
像楼主这种打开可执行文件的的程序,用CreateProcess拉起程序,得到进行信息,再用进程ID通过这个函数GetWindowThreadProcessId返回进行句柄比较保险.SendMessage(hWnd,WM_CLOSE,NULL,NULL);
LiWang112358 2011-03-24
  • 打赏
  • 举报
回复
WM_DESTROY行吗?
jwybobo2007 2011-03-24
  • 打赏
  • 举报
回复
直接TerminateProcess比较靠谱
天山游龙 2011-03-24
  • 打赏
  • 举报
回复
对了,上面代码必须加入
#include "Psapi.h"
#pragma comment(lib,"Psapi.lib")
天山游龙 2011-03-24
  • 打赏
  • 举报
回复
对,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;
}
}
}
}
iiidie 2011-03-24
  • 打赏
  • 举报
回复
HWND hWnd = FindWindow(NULL, _T("QQ"));//这里有问题
//第二个参数必须是的标题栏名字 一般为QQ20XX 不会是QQ
//把它改成
WND hWnd = FindWindow(NULL, _T("QQ20XX"));//20XX为你的QQ标题栏名字
Dreadnought 2011-03-24
  • 打赏
  • 举报
回复
创建进程快照 然后TerminateProcess
kevinhcj 2011-03-24
  • 打赏
  • 举报
回复
对了,开发环境是VS 2008. (P.S. 代码没贴好,见谅!)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧