转 进程监视器
老早以前就要我编一个控制小孩玩电脑的程序。限制他玩游戏的方法很简
单,杀进程就可以了
这里已经用C++,借助MFC把这个功能封装到一个类里面了,功能注释里
面都写得很清楚,看懂此程序需要Windows编程基础。 class CProcMon
{
//公共方法
public:
BOOL Stop();//开始监控
BOOL Start();//停止监控
BOOL WriteLog(char*szMsg);//写入信息到日志文件中 BOOL AddProcess(CString strProcessName); CProcMon();
virtual~CProcMon();
//公共属性
public:
BOOL bWriteLog;//是否写入日志
char*m_szFileName;//日志文件的文件名
int interval;//监控时间周期(越短监控越频繁,越占用系统资源) BOOL(*pfnOnRestricted)(void);//当发现玩游戏时调用的函数 //私有属性
: private
inline void ErrorMessage(LPSTR strMsg);//提示错误信息,内联函数 enum STATUS{RUNNING,STOPPED};
STATUS status;//当前线程运行状态
CWinThread*m_pThread;//线程对象
CList CString,CString m_lstForbidden;//限制运行的程序列表 static UINT ThreadProc(LPVOID lParam);//线程函数 };
CProcMon:CProcMon()
{
status=STOPPED;
interval=10;
m_pThread=NULL;
m_szFileName=NULL;
pfnOnRestricted=NULL;
}
CProcMon:~CProcMon()
{
}
/////////////////////////////Operations//////////////////////////
///
UINT CProcMon:ThreadProc(LPVOID lParam) {
CProcMon*pMain=(CProcMon*)lParam;
pMain-status=RUNNING;
//枚举进程
while(1)
{
PROCESSENTRY32 pe32;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(hSnap==INVALID_HANDLE_VALUE) {
ERROR_MESSAGE("创建进程映像失败~");
}
pe32.dwSize=sizeof(PROCESSENTRY32);
if(~Process32First(hSnap,&pe32))
{
ERROR_MESSAGE("枚举进程失败~");
}
do
{
int i=0;
POSITION pos=pMain-m_lstForbidden.GetHeadPosition(); //查找禁止进程并关闭
for(i=0;i pMain-m_lstForbidden.GetCount();i++) {
CString str;
str=pMain-m_lstForbidden.GetNext(pos); TRACE("\n[查找]%s,[当前]%s",str,pe32.szExeFile); //如果找到对应进程则关闭
if(str.Find(_strlwr(pe32.szExeFile))~=-1) {
TRACE("\n\t找到对应进程~现在即将关闭进程."); if(pMain-bWriteLog) {
char szMsg[1024];
sprintf(szMsg,"发现玩游戏:[%s]\n",pe32.szExeFile); pMain-WriteLog(szMsg);
}
HANDLE hProcess;
if(pMain-pfnOnRestricted~=NULL&&pMain-pfnOnRestricted()==TRUE)
{
hProcess=OpenProcess(PROCESS_ALL_ACCESS,NULL,pe32.th32ProcessID);
if(hProcess)
{
TerminateProcess(hProcess,-1);
CloseHandle(hProcess);
}
}
}
}
}while(Process32Next(hSnap,&pe32)~=NULL); TRACE("\n休息一会儿.");
Sleep(pMain-interval*1000);
}
return 0;
}
AddProcess(CString strProcessName) BOOL CProcMon:
{
m_lstForbidden.AddTail(strProcessName); TRACE("m_lstForbidden.GetCount:%d\n",m_lstForbidden.GetCount());
return TRUE;
}
BOOL CProcMon:Start()
{
if(status==RUNNING) {
return FALSE;
}
m_pThread=AfxBeginThread(ThreadProc,this); //m_hThread=CreateThread(NULL,NULL,ThreadProc,this,NULL,&m_dwThre
adId);
if(m_pThread==NULL) {
ERROR_MESSAGE("创建线程时发生错误~");
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CProcMon:Stop() {
if(status~=RUNNING) return FALSE;
if(TerminateThread(m_pThread-m_hThread,-1)==0)
{
ERROR_MESSAGE("终止线程时出错"); return FALSE;
}
else
{
status=STOPPED;
return TRUE;
}
}
BOOL CProcMon:WriteLog(char*szMsg)
{
char szBuffer[2048];
CFile logFile;
SYSTEMTIME sysTime={0};
GetLocalTime(&sysTime);
if(m_szFileName==NULL) {
ErrorMessage("请指定日志文件名~"); return FALSE;
}
//使用追加方式写文件
if(~logFile.Open(m_szFileName,CFile:modeWrite|CFile:
modeCreate|CFile:modeNoTruncate)) {
ErrorMessage("打开日志文件失败~");
return FALSE;
}
//开始写入文件
logFile.SeekToEnd();
//将字符串写入临时缓冲区中
sprintf(szBuffer,"[%d年%2d月%2d日]【%2d时%2d分%2d秒】【游戏】
\t%s",sysTime.wYear,sysTime.wMonth, sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond,szMsg); logFile.Write(szBuffer,strlen(szBuffer));
logFile.Flush();
logFile.Close();
return TRUE;
}
inline void CProcMon:ErrorMessage(LPSTR strMsg) {
MessageBox(NULL,strMsg,TEXT("发生错误~"),MB_ICONERROR); }