模拟windows任务管理器列举系统进程,并关闭进程......
其實對于 windows進程的操作很簡單,只要理解了 進程線程的概念 對于 進程的操作 那么就只是 幾個函數的 問題了? 。
下面是 對于進程操作要用到的幾個函數 。
進程的概念:我們運行了一個程序,那個這個獨立的程序就是一個進程。進程有自己的私有地址空間,進程中的線程共享這些私有地址空間 。
在一個進程中多個線程共同完成一項功能,可以提高工作的效率。?
HANDLE WINAPI CreateToolhelp32Snapshot(?????//這個函數創建一個系統進程列表的快照 并返快照的句柄 用于操作??
? DWORD dwFlags,??????
? DWORD th32ProcessID?
);
BOOL WINAPI Process32First(???//根據進程快照句柄檢索快照列表中?第一個進程
? HANDLE hSnapshot,?????
? LPPROCESSENTRY32 lppe?
);
BOOL WINAPI Process32Next(?? //根據進程快照句柄 循環檢索進程信息 。。
? HANDLE hSnapshot,?????
? LPPROCESSENTRY32 lppe?
);
HANDLE OpenProcess(???????????????????????????????????? //給定一個進程ID 我們可以打開并且獲取句柄? 用于 ReadProcessMemory? WriteProcessMemory 等等的線程插入使用
? DWORD dwDesiredAccess,? // access flag
? BOOL bInheritHandle,??? // handle inheritance option
? DWORD dwProcessId?????? // process identifier
);
BOOL TerminateProcess(??????????????????????????????//根據指定進程句柄關閉進程
? HANDLE hProcess, // handle to the process?
? UINT uExitCode // exit code for the process
typedef struct tagPROCESSENTRY32 {????//進程信息結構體? 用于接收進程的各種信息
? 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
);
第一個參數的取值
| EWX_LOGOFF | 注銷 |
| EWX_POWEROFF | 斷電. |
| EWX_REBOOT | 重啟. |
| EWX_SHUTDOWN |
下面是一段例子代碼?? 在SDI下測試運行?? 在視圖類中定義一個 CListCtrl類的對象c?
然后定義一個 進程信息類
class ProcessInfo
{
public:
?ProcessInfo(){index=0 ;}
?int index ;
?DWORD hArray[100] ;
};
這些都放在視圖的操作中 ,如果這些做完了 那么就相應copy下面的代碼
?
?
void CMyView::OnInitialUpdate()?? //視圖初始化.....?
{
?CView::OnInitialUpdate();
?GetDocument()->SetTitle("系統進程查看器--MadeBy小衛") ;
?? InitProcessist() ;
}
void CMyView::OnKiilprocess()?? //查殺進程?
{
?? POSITION ps=c.GetFirstSelectedItemPosition();
?? if (ps==NULL)
?? {
??? exit(0) ;
?? }
? int item=c.GetNextSelectedItem(ps) ;
? HANDLE pt=OpenProcess(PROCESS_ALL_ACCESS,FALSE,f.hArray[item]) ;? //打開進程
? TerminateProcess(pt,0) ;? //查殺進程
? 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,"進程地址",LVCFMT_LEFT,350) ;
?c.InsertColumn(0,"進程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)? ;//返回包含進程列表的?
?PROCESSENTRY32 pinfo; //進程信息結構體
?BOOL check=Process32First(sh,&pinfo) ; //檢索進程快照列表中的第一個 進程
?if (check)
?{??
??in.Format("%d",pinfo.th32ParentProcessID) ; //格式換文本
??c.InsertItem(index,in) ;
??c.SetItemText(index,1,pinfo.szExeFile) ;? //設置子項文本
??f.hArray[f.index]=pinfo.th32ProcessID? ;//保存進程ID
??f.index++;
??index++ ;
?}
?
?
?while(Process32Next(sh,&pinfo))?? //如果快照列表存在 那么繼續搜索
?{
??in.Format("%d",pinfo.th32ParentProcessID) ;
??c.InsertItem(index,in) ;
??c.SetItemText(index,1,pinfo.szExeFile) ;
??f.hArray[f.index]=pinfo.th32ProcessID? ;//保存進程ID
??f.index++;
??index++ ;?
?}
}
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/mosatsu/archive/2012/01/18/2466817.html
總結
以上是生活随笔為你收集整理的模拟windows任务管理器列举系统进程,并关闭进程......的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: luatex plain 从零构建
- 下一篇: 限制不能使用最近三次的历史密码