请指点在系统打创建进程之前和之前如何马上得到通知?
谢谢!
谢谢!
解决方案 »
- 给USHORT* 类型变量赋值时,报错。
- 蒋老大请进
- 各位前辈解答一下,关于com聚合的问题。
- 窗口最大化、最小化代码是什么啊
- Modem 建立连接的问题
- 请教各位,FTP 获得目录列表时间字符串分析规则?FTP指令获得的目录列表字符时间不准确
- 有关CTreeCtrl问题
- 欢迎讨论,UP有分!UDP协议,三个IP,两张网卡。。。。。
- OLE_DB中如何使用SetParameterInfo?
- 关于钩子函数的问题
- 求救!我的程序在Debug情况下可以正常编译执行,但在Realease情况下编译通过,执行出现debug assertion failed!谢谢大家
- 超简单问题求助,关于连接错误error LNK2001
另一种不是很实时的方法,是PSAPI.
它是通过这2个函数来实现的:
void CPsManagerDlg::CProcessesList::DeleteZoobieItem(unsigned long aProcesses[],DWORD cProcess)
{
for(int i=0;i<GetItemCount();i++){
for(unsigned long idx=0;idx<cProcess;idx++){
CString sPID;
sPID.Format( "%d", aProcesses[ idx ] );
if(sPID.CompareNoCase(GetItemText(i,1)) == 0) break;
}
if(idx >= cProcess) DeleteItem(i);
}
}//实现了查找不再运行的程序就从LIST中删除
int CPsManagerDlg::CProcessesList::FindPIDIndex( DWORD pid)
{
CString sPID;
sPID.Format( "%d", pid); for(int i=0;i<GetItemCount();i++){
if(sPID.CompareNoCase(GetItemText(i,1)) == 0) return i;
}
return -1;
}//实现了查找已经存在的就不刷新LIST
void CPsManagerDlg::RefreshList()
{
// m_ctlProcesses.DeleteAllItems();
DWORD aProcesses[ 1024 ];
DWORD cProcesses = GetProcessIDs( aProcesses, sizeof( aProcesses ) ); DWORD idxList = 0;
m_ctlProcesses.DeleteZoobieItem(aProcesses,cProcesses);
for( DWORD idx = 0; idx < cProcesses; idx++ )
{
CString sName = GetProcessBaseModuleName( aProcesses[ idx ] ); if( sName.IsEmpty() )
{
continue;
}
CString sPID;
sPID.Format( "%d", aProcesses[ idx ] );
if(m_ctlProcesses.FindPIDIndex(aProcesses[ idx ]) >= 0) continue;
m_ctlProcesses.InsertItem( idxList, sName );
m_ctlProcesses.SetItemText( idxList, 1, sPID );
m_ctlProcesses.SetItemText( idxList, 2, GetProcessPath( aProcesses[ idx ] ) );
m_ctlProcesses.SetItemData( idxList, aProcesses[ idx ] ); idxList++;
}}//刷新函数
怎么实时得到系统有新的进程打开? 很简单就是用一下FindPIDIndex( DWORD pid)
就可以了:),假如还要动态刷新那些不再运行的程序就需要用DeleteZoobieItem(unsigned long aProcesses[],DWORD cProcess)。
在系统中,负责调用CreateProcess创建新进程是个什么进程?
网上这个例子ps_manager.zip在哪?codeguru或是codeproject
www.xfocus.net有一篇挂接windows api函数,比较不错。