关于程序关闭获取的问题! 问一个VC中的问题.我自己编了一个程序,判断另外一个运行程序(如notepad.exe)结束的时候要求我自己编的这个程序有响应,比如发个消息说 notepad已经关闭 应该怎么编写?谢谢分数有的是,急!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用Toolhelp查找相应进程的ID,使用OpenProcess返回HANDLE,通过GetProcessExitCode监视进程的运行。 《csdn开发高手》第8期上有个很合适的例子! csdn开发高手》第8期 地址是什么啊? 可以在这里下载对应的代码http://mag.csdn.net/Content.aspx?ID=51aeec9c-628d-47a1-87c0-38aa197fb53d程序运行监视器 或者这里直接下载http://mag.csdn.net/DownloadMagSource.aspx?M=51aeec9c-628d-47a1-87c0-38aa197fb53d #include <tlhelp32.h> EnableDebugPriv(){ HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) { AfxMessageBox("openprocesstoken"); return; } if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){ CloseHandle( hToken ); { AfxMessageBox("close handle"); return; } } 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 ); } }ListProcess(){ EnableDebugPriv(); CString m_proc; HANDLE hProcessSnap; HANDLE hModuleSnap; PROCESSENTRY32 pe32={0}; MODULEENTRY32 me32={0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == (HANDLE)-1) { return; } pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { do { if(GetVersion()&0x80000000) { CString strpro; CString pstrpro; char MName[_MAX_PATH]; char EXT[_MAX_PATH]; ::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT); pstrpro.Format("%s%s",MName,EXT); strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",pe32.szExeFile,"@"); m_proc+=strpro; } else { if(pe32.th32ProcessID>8) { hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID); if(hModuleSnap!=(HANDLE)-1) { me32.dwSize=sizeof(MODULEENTRY32); if(Module32First(hModuleSnap,&me32)) { CString strpro; CString pstrpro; char MName[_MAX_PATH]; char EXT[_MAX_PATH]; ::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT); pstrpro.Format("%s%s",MName,EXT); strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",me32.szExePath,"@"); m_proc+=strpro; } CloseHandle(hModuleSnap); } } } }while (Process32Next(hProcessSnap, &pe32)); } CloseHandle (hProcessSnap); } 有没有简单点的,因为我判断运行的程序名称是知道的,比如notepad.exe这个也太恐怖点了。最好,一两个命令解决的。 DWORD GetProcessID(PCSTR pszExeFile){ HANDLE hSnapshot = NULL; PROCESSENTRY32 pe= {sizeof(PROCESSENTRY32 )}; BOOL bOk = FALSE; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); bOk = Process32First(hSnapshot,&pe); while(bOk) { if(!lstrcmpi(pe.szExeFile,pszExeFile)) { CloseHandle(hSnapshot); return pe.th32ProcessID; } bOk = Process32Next(hSnapshot,&pe); } CloseHandle(hSnapshot); return 0;}HANDLE hProcess = OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);if(NULL!=hProcess && INVALID_HANDLE_VALUE!=hProcess){GetExitCodeProcess(....);//Keep message loop!} MSG msg;DWORD dwExitCode=STILL_ACTIVE;while(STILL_ACTIVE==dwExitCode){ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } GetExitCodeProcess(hProcess,&dwExitCode); Sleep(1);} MSG msg;DWORD dwExitCode=STILL_ACTIVE;while(STILL_ACTIVE==dwExitCode){ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } GetExitCodeProcess(hProcess,&dwExitCode); Sleep(1);}这个循环跳不出来啊,外面程序关了也还在这个循环里 【高手请进】求将两个16进制字符转化成int型数据的小程序char2toint 子类使用父类的create函数 想做个好玩的东西 点击IDD_ABOUTBOX那个小叉叉发送的是什么消息? HTTP 上传文件到服务器的问题,网上的例子 UseHttpSendReqEx 求教袁锋大哥关于文本编辑器刷新的效率问题(其他人也关注一下吧) 安装打包都快急死人了 WMI遇到了个小问题。。wcout竟然输出不了信息 关于高级音频函数PlaySound() @#$%$#@^$···救我···! activeX控件的问题(图片) 很菜的一个问题,望高手解答.
EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
{
AfxMessageBox("openprocesstoken");
return;
}
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
CloseHandle( hToken );
{
AfxMessageBox("close handle");
return;
}
}
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 );
}
}
ListProcess()
{
EnableDebugPriv();
CString m_proc;
HANDLE hProcessSnap;
HANDLE hModuleSnap;
PROCESSENTRY32 pe32={0};
MODULEENTRY32 me32={0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
{
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(GetVersion()&0x80000000)
{
CString strpro;
CString pstrpro;
char MName[_MAX_PATH];
char EXT[_MAX_PATH];
::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT);
pstrpro.Format("%s%s",MName,EXT);
strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",pe32.szExeFile,"@");
m_proc+=strpro;
}
else
{
if(pe32.th32ProcessID>8)
{
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
if(hModuleSnap!=(HANDLE)-1)
{
me32.dwSize=sizeof(MODULEENTRY32);
if(Module32First(hModuleSnap,&me32))
{
CString strpro;
CString pstrpro;
char MName[_MAX_PATH];
char EXT[_MAX_PATH];
::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT);
pstrpro.Format("%s%s",MName,EXT);
strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",me32.szExePath,"@");
m_proc+=strpro;
}
CloseHandle(hModuleSnap);
}
}
}
}while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle (hProcessSnap);
}
这个也太恐怖点了。
最好,一两个命令解决的。
{
HANDLE hSnapshot = NULL;
PROCESSENTRY32 pe= {sizeof(PROCESSENTRY32 )};
BOOL bOk = FALSE;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
bOk = Process32First(hSnapshot,&pe);
while(bOk)
{
if(!lstrcmpi(pe.szExeFile,pszExeFile))
{
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
bOk = Process32Next(hSnapshot,&pe);
}
CloseHandle(hSnapshot);
return 0;
}
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
if(NULL!=hProcess && INVALID_HANDLE_VALUE!=hProcess)
{
GetExitCodeProcess(....);
//Keep message loop!
}
DWORD dwExitCode=STILL_ACTIVE;
while(STILL_ACTIVE==dwExitCode)
{ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetExitCodeProcess(hProcess,&dwExitCode);
Sleep(1);
}
DWORD dwExitCode=STILL_ACTIVE;
while(STILL_ACTIVE==dwExitCode)
{ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetExitCodeProcess(hProcess,&dwExitCode);
Sleep(1);
}
这个循环跳不出来啊,外面程序关了也还在这个循环里