模拟windows任务管理器列举系统进程,并关闭进程......
其實(shí)對(duì)于 windows進(jìn)程的操作很簡(jiǎn)單,只要理解了 進(jìn)程線程的概念 對(duì)于 進(jìn)程的操作 那么就只是 幾個(gè)函數(shù)的 問(wèn)題了? 。
下面是 對(duì)于進(jìn)程操作要用到的幾個(gè)函數(shù) 。
進(jìn)程的概念:我們運(yùn)行了一個(gè)程序,那個(gè)這個(gè)獨(dú)立的程序就是一個(gè)進(jìn)程。進(jìn)程有自己的私有地址空間,進(jìn)程中的線程共享這些私有地址空間 。
在一個(gè)進(jìn)程中多個(gè)線程共同完成一項(xiàng)功能,可以提高工作的效率。?
HANDLE WINAPI CreateToolhelp32Snapshot(?????//這個(gè)函數(shù)創(chuàng)建一個(gè)系統(tǒng)進(jìn)程列表的快照 并返快照的句柄 用于操作??
? DWORD dwFlags,??????
? DWORD th32ProcessID?
);
BOOL WINAPI Process32First(???//根據(jù)進(jìn)程快照句柄檢索快照列表中?第一個(gè)進(jìn)程
? HANDLE hSnapshot,?????
? LPPROCESSENTRY32 lppe?
);
BOOL WINAPI Process32Next(?? //根據(jù)進(jìn)程快照句柄 循環(huán)檢索進(jìn)程信息 。。
? HANDLE hSnapshot,?????
? LPPROCESSENTRY32 lppe?
);
HANDLE OpenProcess(???????????????????????????????????? //給定一個(gè)進(jìn)程ID 我們可以打開(kāi)并且獲取句柄? 用于 ReadProcessMemory? WriteProcessMemory 等等的線程插入使用
? DWORD dwDesiredAccess,? // access flag
? BOOL bInheritHandle,??? // handle inheritance option
? DWORD dwProcessId?????? // process identifier
);
BOOL TerminateProcess(??????????????????????????????//根據(jù)指定進(jìn)程句柄關(guān)閉進(jìn)程
? HANDLE hProcess, // handle to the process?
? UINT uExitCode // exit code for the process
typedef struct tagPROCESSENTRY32 {????//進(jìn)程信息結(jié)構(gòu)體? 用于接收進(jìn)程的各種信息
? DWORD dwSize;
? DWORD cntUsage;
? DWORD th32ProcessID;
? ULONG_PTR th32DefaultHeapID;
? DWORD th32ModuleID;
? DWORD cntThreads;
? DWORD th32ParentProcessID;
? LONG? pcPriClassBase;
? DWORD dwFlags;
? TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
?
BOOL ExitWindowsEx(
? UINT uFlags,???? // shutdown operation
? DWORD dwReason?? // shutdown reason
);
第一個(gè)參數(shù)的取值
| EWX_LOGOFF | 注銷 |
| EWX_POWEROFF | 斷電. |
| EWX_REBOOT | 重啟. |
| EWX_SHUTDOWN |
下面是一段例子代碼?? 在SDI下測(cè)試運(yùn)行?? 在視圖類中定義一個(gè) CListCtrl類的對(duì)象c?
然后定義一個(gè) 進(jìn)程信息類
class ProcessInfo
{
public:
?ProcessInfo(){index=0 ;}
?int index ;
?DWORD hArray[100] ;
};
這些都放在視圖的操作中 ,如果這些做完了 那么就相應(yīng)copy下面的代碼
?
?
void CMyView::OnInitialUpdate()?? //視圖初始化.....?
{
?CView::OnInitialUpdate();
?GetDocument()->SetTitle("系統(tǒng)進(jìn)程查看器--MadeBy小衛(wèi)") ;
?? InitProcessist() ;
}
void CMyView::OnKiilprocess()?? //查殺進(jìn)程?
{
?? POSITION ps=c.GetFirstSelectedItemPosition();
?? if (ps==NULL)
?? {
??? exit(0) ;
?? }
? int item=c.GetNextSelectedItem(ps) ;
? HANDLE pt=OpenProcess(PROCESS_ALL_ACCESS,FALSE,f.hArray[item]) ;? //打開(kāi)進(jìn)程
? TerminateProcess(pt,0) ;? //查殺進(jìn)程
? InitProcessist();//初始化列表
}
void CMyView::InitProcessist()
{
?int index=0 ;
?CString in ;?
?
?if(c.m_hWnd==NULL)
?{
?c.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SINGLESEL ,CRect(0,0,600,500), this, 1);
?c.InsertColumn(0,"進(jìn)程地址",LVCFMT_LEFT,350) ;
?c.InsertColumn(0,"進(jìn)程ID",LVCFMT_LEFT,250) ;
?c.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE)? ;
?}
?else
?{
??c.DeleteAllItems() ;
??ZeroMemory(&f,sizeof(f)) ;
?}
?HANDLE sh=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)? ;//返回包含進(jìn)程列表的?
?PROCESSENTRY32 pinfo; //進(jìn)程信息結(jié)構(gòu)體
?BOOL check=Process32First(sh,&pinfo) ; //檢索進(jìn)程快照列表中的第一個(gè) 進(jìn)程
?if (check)
?{??
??in.Format("%d",pinfo.th32ParentProcessID) ; //格式換文本
??c.InsertItem(index,in) ;
??c.SetItemText(index,1,pinfo.szExeFile) ;? //設(shè)置子項(xiàng)文本
??f.hArray[f.index]=pinfo.th32ProcessID? ;//保存進(jìn)程ID
??f.index++;
??index++ ;
?}
?
?
?while(Process32Next(sh,&pinfo))?? //如果快照列表存在 那么繼續(xù)搜索
?{
??in.Format("%d",pinfo.th32ParentProcessID) ;
??c.InsertItem(index,in) ;
??c.SetItemText(index,1,pinfo.szExeFile) ;
??f.hArray[f.index]=pinfo.th32ProcessID? ;//保存進(jìn)程ID
??f.index++;
??index++ ;?
?}
}
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mosatsu/archive/2012/01/18/2466817.html
總結(jié)
以上是生活随笔為你收集整理的模拟windows任务管理器列举系统进程,并关闭进程......的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: luatex plain 从零构建
- 下一篇: VS2010 创建WindowsServ