// 遍歷進程Dlg.cpp : 實現文件 // #include "stdafx.h" #include "遍歷進程.h" #include "遍歷進程Dlg.h" #include "afxdialogex.h" #include <windows.h> #include <TlHelp32.h> #include <locale.h> #include "MyListCtrll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用於應用程序「關於」菜單項的 CAboutDlg 對話框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 對話框數據 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 實現 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // C遍歷進程Dlg 對話框 C遍歷進程Dlg::C遍歷進程Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(C遍歷進程Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void C遍歷進程Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1,obj_MyList); } BEGIN_MESSAGE_MAP(C遍歷進程Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &C遍歷進程Dlg::OnLvnItemchangedList1) ON_BN_CLICKED(IDC_BUTTON1, &C遍歷進程Dlg::OnBnClickedButton1) END_MESSAGE_MAP() // C遍歷進程Dlg 消息處理程序 BOOL C遍歷進程Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將「關於...」菜單項添加到系統菜單中。 // IDM_ABOUTBOX 必須在系統命令範圍內。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動 // 執行此操做 SetIcon(m_hIcon, TRUE); // 設置大圖標 SetIcon(m_hIcon, FALSE); // 設置小圖標 obj_MyList.InsertCol(3, L"進程ID", 100, L"進程名", 270, L"父進程",150); // TODO: 在此添加額外的初始化代碼 /*m_MylistCtrl.InsertColumn(0, TEXT("進程ID"), 0, 100); m_MylistCtrl.InsertColumn(1, TEXT("進程名"), 0, 270); m_MylistCtrl.InsertColumn(2, TEXT("父進程"), 0, 150);*/ return TRUE; // 除非將焦點設置到控件,不然返回 TRUE } void C遍歷進程Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 若是向對話框添加最小化按鈕,則須要下面的代碼 // 來繪製該圖標。 對於使用文檔/視圖模型的 MFC 應用程序, // 這將由框架自動完成。 void C遍歷進程Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用於繪製的設備上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使圖標在工做區矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 繪製圖標 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //當用戶拖動最小化窗口時系統調用此函數取得光標 //顯示。 HCURSOR C遍歷進程Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void C遍歷進程Dlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 在此添加控件通知處理程序代碼 *pResult = 0; } //轉爲寬字符宏 #define CHAR_TO_WCHAR(lpChar,lpW_Char) MultiByteToWideChar(CP_ACP,NULL,lpChar,-1,lpW_Char,_countof(lpW_Char)); void C遍歷進程Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 obj_MyList.DeleteAllItems(); HANDLE hSnap = NULL; PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; //1 建立一個快照 hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //2 找到第一個進程 if (Process32First(hSnap, &pe32) == 0) { CloseHandle(hSnap); return; } //3 循環遍歷進程 int i = 0; do { TCHAR lpW_Char[200] = {}; TCHAR lpW_Char1[200] = {}; TCHAR lpW_Char2[200] = {}; _stprintf_s(lpW_Char, 200, _T("%s"), pe32.szExeFile); _stprintf_s(lpW_Char1, 200, _T("%d"), pe32.th32ParentProcessID); _stprintf_s(lpW_Char2, 200, _T("%d"), pe32.th32ProcessID); obj_MyList.InsertOnLineItem(3, lpW_Char2, lpW_Char, lpW_Char1); i++; /* obj_MyList.InsertOnLineItem(4, L"2009", L"9月5日", L"清華大學附中", L"班長"); obj_MyList.InsertOnLineItem(4, L"2011", L"9月5日", L"清華大學", L"學生會主席");*/ /*TCHAR lpW_Char[200] = {}; m_MylistCtrl.InsertItem(i, TEXT("")); m_MylistCtrl.SetItemText(i, 0, (LPCTSTR)pe32.th32ProcessID); _stprintf_s(lpW_Char,200, _T("%s"),pe32.szExeFile); m_MylistCtrl.SetItemText(i, 1, lpW_Char); m_MylistCtrl.SetItemText(i, 2, (LPCTSTR)pe32.th32ParentProcessID); i++; */ } while (Process32Next(hSnap, &pe32)); //遍歷模塊-----未完成 // 05 遍歷模塊.cpp : 定義控制檯應用程序的入口點。 // //#include "stdafx.h" //#include <windows.h> //#include <TlHelp32.h> // bool GetModuleList(DWORD dwPId) { // HANDLE hModuleSnap = INVALID_HANDLE_VALUE; // MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) }; // // 1. 建立一個模塊相關的快照句柄 // hModuleSnap = CreateToolhelp32Snapshot( // TH32CS_SNAPMODULE, // 指定快照的類型 // dwPId); // 指定進程 // if (hModuleSnap == INVALID_HANDLE_VALUE) // return false; // // 2. 經過模塊快照句柄獲取第一個模塊信息 // if (!Module32First(hModuleSnap, &me32)) { // CloseHandle(hModuleSnap); // return false; // } // // 3. 循環獲取模塊信息 // do { // me32.th32ProcessID; // //... // } while (Module32Next(hModuleSnap, &me32)); // // 4. 關閉句柄並退出函數 // CloseHandle(hModuleSnap); // return true; // } // // int _tmain(int argc, _TCHAR* argv[]) // { // return 0; // } // return; }