进程模块查看器

主要界面如下:

进程模块查看器

主要代码如下:

  1 BOOL CEnumProcessDlg::OnInitDialog()

  2 {

  3     CDialog::OnInitDialog();

  4 

  5     // 将“关于...”菜单项添加到系统菜单中。

  6 

  7     // IDM_ABOUTBOX 必须在系统命令范围内。

  8     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

  9     ASSERT(IDM_ABOUTBOX < 0xF000);

 10 

 11     CMenu* pSysMenu = GetSystemMenu(FALSE);

 12     if (pSysMenu != NULL)

 13     {

 14         CString strAboutMenu;

 15         strAboutMenu.LoadString(IDS_ABOUTBOX);

 16         if (!strAboutMenu.IsEmpty())

 17         {

 18             pSysMenu->AppendMenu(MF_SEPARATOR);

 19             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

 20         }

 21     }

 22 

 23     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

 24     //  执行此操作

 25     SetIcon(m_hIcon, TRUE);            // 设置大图标

 26     SetIcon(m_hIcon, FALSE);        // 设置小图标

 27 

 28     // TODO: 在此添加额外的初始化代码

 29     LONG lStyle;

 30     lStyle = GetWindowLong(m_ctrlList.m_hWnd, GWL_STYLE);

 31     lStyle &= ~LVS_TYPEMASK;

 32     lStyle |= LVS_REPORT;

 33     SetWindowLong(m_ctrlList.m_hWnd, GWL_STYLE, lStyle);

 34 

 35     DWORD dwStyle = m_ctrlList.GetExtendedStyle();

 36     dwStyle |= LVS_EX_FULLROWSELECT;

 37     dwStyle |= LVS_EX_GRIDLINES;

 38     m_ctrlList.SetExtendedStyle(dwStyle);

 39     m_ctrlList.InsertColumn(0, _T("Process ID"), LVCFMT_LEFT, 75);

 40     m_ctrlList.InsertColumn(1, _T("Process Name"), LVCFMT_LEFT, 120);

 41     m_ctrlList.InsertColumn(2, _T("Parent Process ID"), LVCFMT_LEFT, 115);

 42     m_ctrlList.InsertColumn(3, _T("Thread Count"), LVCFMT_LEFT, 90);

 43     ListProcess();

 44 

 45     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

 46 }

 47 

 48 void CEnumProcessDlg::OnSysCommand(UINT nID, LPARAM lParam)

 49 {

 50     if ((nID & 0xFFF0) == IDM_ABOUTBOX)

 51     {

 52         CAboutDlg dlgAbout;

 53         dlgAbout.DoModal();

 54     }

 55     else

 56     {

 57         CDialog::OnSysCommand(nID, lParam);

 58     }

 59 }

 60 

 61 // 如果向对话框添加最小化按钮,则需要下面的代码

 62 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

 63 //  这将由框架自动完成。

 64 

 65 void CEnumProcessDlg::OnPaint()

 66 {

 67     if (IsIconic())

 68     {

 69         CPaintDC dc(this); // 用于绘制的设备上下文

 70 

 71         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

 72 

 73         // 使图标在工作矩形中居中

 74         int cxIcon = GetSystemMetrics(SM_CXICON);

 75         int cyIcon = GetSystemMetrics(SM_CYICON);

 76         CRect rect;

 77         GetClientRect(&rect);

 78         int x = (rect.Width() - cxIcon + 1) / 2;

 79         int y = (rect.Height() - cyIcon + 1) / 2;

 80 

 81         // 绘制图标

 82         dc.DrawIcon(x, y, m_hIcon);

 83     }

 84     else

 85     {

 86         CDialog::OnPaint();

 87     }

 88 }

 89 

 90 //当用户拖动最小化窗口时系统调用此函数取得光标显示。

 91 //

 92 HCURSOR CEnumProcessDlg::OnQueryDragIcon()

 93 {

 94     return static_cast<HCURSOR>(m_hIcon);

 95 }

 96 

 97 

 98 void CEnumProcessDlg::ListProcess(void)

 99 {

100     HANDLE hProcessSnap;

101     PROCESSENTRY32 pe32;

102     

103     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

104     if (hProcessSnap == INVALID_HANDLE_VALUE)

105     {

106         CString strErr;

107         strErr.Format(_T("CreateToolhelp32Snapshot failed:%d"), GetLastError());

108         AfxMessageBox(strErr);

109         return;

110     }

111 

112     pe32.dwSize = sizeof(PROCESSENTRY32);

113 

114     int index = 0;

115     if (!Process32First(hProcessSnap, &pe32))

116     {

117         CString strErr;

118         strErr.Format(_T("Process32First failed:%d"), GetLastError());

119         AfxMessageBox(strErr);

120         CloseHandle(hProcessSnap);

121         return;

122     }

123 

124     do 

125     {

126         CString strID;

127         strID.Format(_T("%d"), pe32.th32ProcessID);

128         m_ctrlList.InsertItem(index, strID);

129         m_ctrlList.SetItemText(index, 1, pe32.szExeFile);

130         strID.Format(_T("%d"), pe32.th32ParentProcessID);

131         m_ctrlList.SetItemText(index, 2, strID);

132         strID.Format(_T("%d"), pe32.cntThreads);

133         m_ctrlList.SetItemText(index++, 3, strID);

134     } while (Process32Next(hProcessSnap, &pe32));

135 

136     CloseHandle(hProcessSnap);

137 }

138 

139 void CEnumProcessDlg::OnContextMenu(CWnd* pWnd, CPoint point)

140 {

141     // TODO: 在此处添加消息处理程序代码

142     CMenu menu;

143 

144     if (menu.CreatePopupMenu() == FALSE)

145     {

146         return;

147     }

148     

149     if (pWnd == &m_ctrlList)

150     {

151         menu.AppendMenu(MF_STRING , ID_SCANMODULE , _T("查看依赖模块"));

152         if(m_ctrlList.GetSelectedCount() < 0)

153         {

154             menu.EnableMenuItem(ID_SCANMODULE , MF_DISABLED | MF_GRAYED);

155         }

156     }

157 

158     menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);

159 }

160 

161 void CEnumProcessDlg::ScanModule(UINT nID)

162 {

163     switch (nID)

164     {

165     case ID_SCANMODULE:

166         {

167             CString strProcessID = m_ctrlList.GetItemText(m_ctrlList.GetSelectionMark(), 0);

168             CProcessModule dlgProcessModule;

169             dlgProcessModule.m_dwProcessID = _tcstoul(strProcessID, 0, 10);

170             dlgProcessModule.DoModal();

171         }

172         break;

173     default:

174         break;

175     }

176 }

177 

178 void CEnumProcessDlg::OnNMDblclkListProcess(NMHDR *pNMHDR, LRESULT *pResult)

179 {

180     // TODO: 在此添加控件通知处理程序代码

181     CString strProcessID = m_ctrlList.GetItemText(m_ctrlList.GetSelectionMark(), 0);

182     CProcessModule dlgProcessModule;

183     dlgProcessModule.m_dwProcessID = _tcstoul(strProcessID, 0, 10);

184     dlgProcessModule.DoModal();

185     *pResult = 0;

186 }

下载地址如下:

http://pan.baidu.com/s/1gdeJ3xT

你可能感兴趣的:(进程)