您的位置:首页 > 其它

ToolHelp系列函数使用总结

2006-08-12 21:01 513 查看
为了熟悉一下ToolHelp系列函数,所以写了这个东西,做为此时的学习总结,程

序的界面如下:



为了方便以后使用,我将它写成了DLL,并导出了两个函数:Init、Destroy,现将

代码贴出,留待以后查证。

本文中所涉及的变量和函数均采用化名,请勿对号入座!

001 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
002 ////列举系统进程,并通过得升权限的方式,枚举进程模块
003 ////,给出内存使用图
004 ////
005 ////thinkSJ 2006-06-13
006 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
007 #include <windows.h>
008 #include "resource.h"
009 #include <commctrl.h> //通用控件
010 #include <tlhelp32.h> //快照头文件
011 #pragma comment(lib,"comctl32")//导入库
012
013 void UpdateProcess(HWND); //自定义函数,更新进程
014 void UpdateModule(int); //自定义函数,更新模块
015 HWND hMain; //主窗口句柄
016 HINSTANCE hInst; //实例句柄
017 BOOL bGoogle = false; //是否Google
018 BOOL bDebug = false; //是否调试
019 int nProcessID;
020 int nIndex;
021 //主对话框回调函数
022 LRESULT __stdcall DialogProc(HWND,UINT,WPARAM,LPARAM);
023 LRESULT CALLBACK MemoryProc(HWND,UINT,WPARAM,LPARAM);//内存对话框回调函数
024 LRESULT CALLBACK ThreadProc(HWND,UINT,WPARAM,LPARAM);//线程对话框回调函数
025
026 extern "C"
027 __declspec(dllexport)void Init();
028 BOOL CALLBACK DllMain(HANDLE hModule,DWORD,LPVOID)
029 {
030 hInst = (HINSTANCE)hModule;
031 return true;
032 }
033
034 extern "C"
035 __declspec(dllexport)void Init()//导出此函数
036 {
037 //初使化库
038 ::InitCommonControls ();
039 ::DialogBoxParam (hInst,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)DialogProc,NULL);
040 }
041 extern "C"
042 __declspec(dllexport)void Destroy()
043 {
044 ::SendMessage (hMain,WM_CLOSE,0,0);
045 }
046
047 LRESULT __stdcall DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
048 {
049 // 取得进程ID号
050 HKEY hKeyResult;
051 char szGoogle[56] = "http://www.google.com/search?q=%s";
052 unsigned char szRegDebug[256] ="";//调试器名称及路径
053 unsigned long lType = REG_SZ;//键类型
054 char szValueName[256] = "";//键名
055 DWORD lValueName = 256;
056 DWORD lRet = 256;
057 LVITEM li;
058 char szID[56];
059 memset(&li, 0, sizeof(LVITEM));
060 li.iSubItem = 1;
061 li.cchTextMax = 56;
062 li.pszText = szID;
063 hMain = hDlg;
064 switch(message)
065 {
066 case WM_INITDIALOG://初使化消息
067 {
068 ::SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//置顶
069 //////////////////////////////////////////////////////////////////////////////////////////////////////
070 ///////////进程列表
071 //////////////////////////////////////////////////////////////////////////////////////////////////////
072
073 // 初始化列表视图控件
074 HWND hWndList = ::GetDlgItem(hDlg, IDC_LIST);
075 // 设置它的扩展风格
076 ::SendMessage(hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE,
077 0, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
078 LVCOLUMN column;
079 // 指定LVCOLUMN结构中的pszText、fmt、cx域有效
080 column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
081 // 设置有效的域的属性
082 column.fmt = LVCFMT_CENTER; // 指定文本居中显示
083 column.cx = 100; // 指定此栏的宽度
084 column.pszText = "映象名称"; // 指定此栏显示的文本
085 // 添加一个新的专栏
086 ::SendMessage(hWndList, LVM_INSERTCOLUMN, 0, (LPARAM)&column);
087 // 再添加一个专栏
088 column.pszText = "ID";
089 column.cx = 50;
090 ::SendMessage(hWndList, LVM_INSERTCOLUMN, 1, (LPARAM)&column);
091 column.pszText = "PID";
092 column.cx = 80;
093 ::SendMessage (hWndList,LVM_INSERTCOLUMN,2,(LPARAM)&column);
094 column.pszText = "线程数";
095 column.cx = 80;
096 ::SendMessage (hWndList,LVM_INSERTCOLUMN,3,(LPARAM)&column);
097
098 //////////////////////////////////////////////////////////////////////////////////////////////////////
099 /////////模块列表
100 //////////////////////////////////////////////////////////////////////////////////////////////////////
101 HWND hWndModu = ::GetDlgItem(hDlg, IDC_LISTMODULE);
102 // 设置它的扩展风格
103 ::SendMessage(hWndModu, LVM_SETEXTENDEDLISTVIEWSTYLE,
104 0, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
105 LVCOLUMN column1;
106 // 指定LVCOLUMN结构中的pszText、fmt、cx域有效
107 column1.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
108 // 设置有效的域的属性
109 column1.fmt = LVCFMT_LEFT; // 指定文本左对齐显示
110 column1.cx = 100; // 指定此栏的宽度
111 column1.pszText = "名 称"; // 指定此栏显示的文本
112 // 添加一个新的专栏
113 ::SendMessage(hWndModu, LVM_INSERTCOLUMN, 0, (LPARAM)&column1);
114 // 再添加一个专栏
115 column1.pszText = "路 径";
116 column1.cx = 120;
117 ::SendMessage(hWndModu, LVM_INSERTCOLUMN, 1, (LPARAM)&column1);
118
119 column1.pszText = "基地址(0X)";
120 column1.cx = 100;
121 ::SendMessage(hWndModu, LVM_INSERTCOLUMN, 2, (LPARAM)&column1);
122
123 column1.pszText = "大 小";
124 column1.cx = 70;
125 ::SendMessage(hWndModu, LVM_INSERTCOLUMN, 3, (LPARAM)&column1);
126
127 column1.pszText = "句 柄";
128 column1.cx = 70;
129 ::SendMessage(hWndModu, LVM_INSERTCOLUMN, 4, (LPARAM)&column1);
130
131 UpdateProcess(hWndList);//更新进程列表
132 }
133 break;
134
135 case WM_COMMAND:
136 switch(LOWORD(wParam))
137 {
138 case IDCANCEL:
139 ::EndDialog(hDlg, IDCANCEL);
140 break;
141 case IDC_MEMORY:
142 ::DialogBoxParam (hInst,(LPCTSTR)IDD_MEMORY,NULL,(DLGPROC)MemoryProc,NULL);
143 case IDC_UPDATE://点击更新按钮
144 UpdateProcess(::GetDlgItem(hDlg, IDC_LIST));//更新进程列表
145 break;
146 case IDC_GOOGLE://////Google
147 li.iSubItem = 0;//进程名
148 if(bGoogle)
149 {
150 ::SendDlgItemMessage (hDlg,IDC_LIST, LVM_GETITEMTEXT,(WPARAM)(int) nIndex,
151 (long)&li);//得到进程名
152 wsprintf(szGoogle,"http://www.google.com/search?q=%s",li.pszText);
153 ::ShellExecute (NULL,NULL,"IEXPLORE.EXE",szGoogle
154 ,NULL,SW_SHOWNORMAL);
155 bGoogle = false;
156 }else{
157 ::MessageBox (hDlg,"请选择一个进程!","Info",0);
158 }
159 break;
160 case IDC_DEBUG:////调试
161 li.iSubItem = 1;//进程ID
162 if(::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
163 "SOFTWARE//Microsoft//Windows NT//CurrentVersion//AeDebug",
164 0,KEY_READ,&hKeyResult)==ERROR_SUCCESS)
165 {
166 ::RegEnumValue (hKeyResult,1,szValueName,&lValueName,0,&lType
167 ,szRegDebug,&lRet);//查询键及值
168 ::RegCloseKey (hKeyResult);//关闭
169 }
170 if(strcmp((const char*)szRegDebug,"") ==0)//是否存在调试器
171 {
172 ::MessageBox (hMain,"没有调试器","Info",0);
173 break;
174 }
175 if(bDebug)
176 {
177 //////得到进程ID
178 ::SendDlgItemMessage (hDlg,IDC_LIST, LVM_GETITEMTEXT,(WPARAM)(int) nIndex,
179 (long)&li);//得到进程ID
180 //格式化字符串
181 wsprintf(szValueName,(const char*)szRegDebug,atol(li.pszText),0);
182 ::WinExec (szValueName,SW_SHOWNORMAL);//运行
183 bDebug = false;
184 }
185 break;
186 case IDC_NET:
187 break;
188 case IDC_THREAD:
189 ::DialogBoxParam (hInst,(LPCTSTR)IDD_THREAD,NULL,(DLGPROC)ThreadProc,NULL);
190 break;
191 }
192 break;
193
194 case WM_NOTIFY: //子控件消息
195 {
196 if(wParam == IDC_LIST)//如果是进程列表控件
197 {
198 NMHDR* pHeader = (NMHDR*)lParam;
199 HWND hWndList = pHeader->hwndFrom;
200
201 if(pHeader->code == NM_DBLCLK) // 如果是双击事件
202 {
203 NMLISTVIEW* pNMListView = (NMLISTVIEW*)pHeader;
204 // 用户双击的项号
205 int nIndex = pNMListView->iItem;
206
207 // 取得进程ID号
208 LVITEM lvi; //条目结构
209 memset(&lvi, 0, sizeof(LVITEM));//清空
210 lvi.iSubItem = 1;
211 lvi.cchTextMax = 56;
212 lvi.pszText = szID;
213 //得到进程名
214 ::SendMessage(hWndList, LVM_GETITEMTEXT, (WPARAM)nIndex, (long)&lvi);
215 if(::MessageBox(hDlg, "确实要终止进程吗?",
216 "Info", MB_OKCANCEL|MB_DEFBUTTON2) == IDCANCEL)
217 return 0;
218
219 // 打开目标进程,终止它
220 HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, atoi(szID));
221 if(hProcess != NULL)
222 {
223 if(::TerminateProcess(hProcess, 0))// 结束进程
224 {
225 ::Sleep (50); //休息005秒
226 UpdateProcess(hWndList);//更新进程列表
227 }
228 else
229 {
230 ::MessageBox (0,"无法结束进程","Info",0);
231 }
232 }
233 }else{
234 if (pHeader ->code == LVN_ITEMCHANGED)//如果是单击事件
235 {
236 NMLISTVIEW* pNMListView = (NMLISTVIEW*)pHeader;
237 if (pNMListView->uNewState )
238 {
239 bGoogle = true;
240 bDebug = true;
241 nIndex = pNMListView->iItem;//得到索引
242 //得到进程名
243 ::SendMessage(hWndList, LVM_GETITEMTEXT, (WPARAM)nIndex, (long)&li);
244 nProcessID = atoi(szID);//进程ID
245 UpdateModule(atoi(szID));//更新模块列表
246 }
247 }
248 }
249 }
250 }
251 break;
252 }
253 return 0;
254 }
255
256 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
257 /////////////列出进程
258 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
259 void UpdateProcess(HWND hWndList)
260 {
261 // 删除所有的项
262 ::SendMessage(hWndList, LVM_DELETEALLITEMS, 0, 0);
263 int nItem = 0; // 项计数
264
265 PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; //进程结构体
266 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //快照进程
267 if(hProcessSnap == INVALID_HANDLE_VALUE)
268 return;
269 if(Process32First(hProcessSnap, &pe32))
270 {
271 do
272 {
273 // 取得进程ID号
274 char szID[56];
275 wsprintf(szID, "%u", pe32.th32ProcessID);
276
277 // 插入一个项
278 LVITEM item = { 0 };
279 item.iItem = nItem;
280
281 item.mask = LVIF_TEXT; // 指定pszText域有效
282 item.pszText = (LPTSTR)pe32.szExeFile; // 进程名称
283 //插入一项
284 ::SendMessage(hWndList, LVM_INSERTITEM, 0, (long)&item);
285
286 // 设置新项的文本
287 LVITEM lvi;
288 lvi.iSubItem = 1; // 指定要设置第1个专栏的文本
289 lvi.pszText = (LPTSTR)szID; // 要设置的文本
290 ::SendMessage(hWndList, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
291
292 wsprintf(szID,"%u",pe32.th32ParentProcessID );//父进程ID
293 lvi.iSubItem = 2;
294 lvi.pszText = szID ;
295 ::SendMessage(hWndList, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
296
297 wsprintf(szID,"%u",pe32.cntThreads );//线程数
298 lvi.iSubItem = 3;
299 lvi.pszText = szID;
300 ::SendMessage(hWndList, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
301
302 nItem++;
303 }while(Process32Next(hProcessSnap, &pe32));
304 char sproc[20];
305 wsprintf(sproc,"进程数:%u",nItem);
306 HWND hStatic = ::GetDlgItem (hMain,IDC_STATIC1);
307 ::SendMessage (hStatic,WM_SETTEXT,0,(LPARAM)sproc);//设置进程数
308 ::CloseHandle(hProcessSnap); //关闭句柄
309 ::CloseHandle (hStatic);
310 }
311 }
312
313 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
314 /////////////列出进程模块
315 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
316 void UpdateModule(int ProcID)
317 {
318 HANDLE hNew;
319 LUID uID;
320 //打开当前进程访问令牌
321 ::OpenProcessToken (::GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES,&hNew);
322 ::LookupPrivilegeValue (NULL,SE_DEBUG_NAME,&uID);//查看权限
323 TOKEN_PRIVILEGES tp ; //权限结构体
324 tp.PrivilegeCount = 1;
325 tp.Privileges[0].Luid = uID;
326 tp.Privileges [0].Attributes = SE_PRIVILEGE_ENABLED;
327 //设置为调度权限
328 ::AdjustTokenPrivileges (hNew,false,&tp,sizeof(tp),NULL,NULL);
329 HWND hwndm = ::GetDlgItem (hMain,IDC_LISTMODULE);
330 // 删除所有的项
331 ::SendMessage(hwndm, LVM_DELETEALLITEMS, 0, 0);
332
333 MODULEENTRY32 me32 = {sizeof(MODULEENTRY32)};//模块结构体
334 if(ProcID == 0)
335 return;
336 HANDLE hModule = ::CreateToolhelp32Snapshot (TH32CS_SNAPMODULE,ProcID);//快照模块
337 int nItem = 0; // 项计数
338 if(hModule == INVALID_HANDLE_VALUE)
339 return;
340 if (::Module32First (hModule,&me32))
341 {
342 do
343 {
344 // 取得进程ID号
345 char szID[56];
346 wsprintf(szID, "%u", me32.th32ModuleID);
347
348 // 插入一个项
349 LVITEM item = { 0 };
350 item.iItem = nItem;
351
352 item.mask = LVIF_TEXT; // 指定pszText域有效
353 item.pszText = (LPTSTR)me32.szModule ; // 模块名称
354 ::SendMessage(hwndm, LVM_INSERTITEM, 0, (long)&item);
355
356 // 设置新项的文本
357 LVITEM lvi;
358 lvi.iSubItem = 1; // 指定要设置第1个专栏的文本
359 lvi.pszText = (LPTSTR)me32.szExePath; // 要设置的文本
360 ::SendMessage(hwndm, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
361
362
363 wsprintf(szID,"%08x",me32.modBaseAddr);//模块基址
364 lvi.iSubItem = 2;
365 lvi.pszText = szID ;
366 ::SendMessage(hwndm, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
367
368 wsprintf(szID,"%u",me32.modBaseSize);//大小
369 lvi.iSubItem = 3;
370 lvi.pszText = szID;
371 ::SendMessage(hwndm, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
372
373 wsprintf(szID,"%x",me32.hModule);//句柄
374 lvi.iSubItem = 4;
375 lvi.pszText = szID;
376 ::SendMessage(hwndm, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
377
378 nItem++;
379 }
380 while(::Module32Next(hModule, &me32));
381 }
382 tp.Privileges [0].Attributes = 0;
383 //将权限调整为正常
384 ::AdjustTokenPrivileges (hNew,false,&tp,sizeof(tp),NULL,NULL);
385 char sproc[20];
386 wsprintf(sproc,"模块数:%u",nItem );
387 HWND hStatic = ::GetDlgItem (hMain,IDC_STATICMODULE);
388 ::SendMessage (hStatic,WM_SETTEXT,0,(LPARAM)sproc); //设置模块数
389 ::CloseHandle(hModule); //关闭句柄
390 ::CloseHandle (hStatic);
391 ::CloseHandle (hNew);
392 }
393
394 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
395 //////////得到线程
396 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
397 void UpdateThread(HWND hWnd)
398 {
399
400 char szID[56];
401 THREADENTRY32 te32 = {0};//线程结构
402 te32.dwSize = sizeof(THREADENTRY32);
403 int nIndexThread = 0;//列表索引
404 HWND hWndThread = ::GetDlgItem (hWnd,IDC_THREAD); //得到列表控件句柄
405 // 删除所有的项
406 ::SendMessage(hWndThread, LVM_DELETEALLITEMS, 0, 0);
407 HANDLE hThread = ::CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD,nProcessID);
408
409 if(!::Thread32First (hThread,&te32))
410 return;
411 do{
412 if(te32.th32OwnerProcessID == (DWORD)nProcessID)
413 {
414
415 LVITEM item = { 0 };
416 item.iItem = nIndexThread;
417
418 item.mask = LVIF_TEXT; // 指定pszText域有效
419 wsprintf(szID,"%u",te32.th32ThreadID );// 线程ID
420 item.pszText = (LPTSTR)szID ;
421 ::SendMessage(hWndThread, LVM_INSERTITEM, 0, (long)&item);
422
423 LVITEM lvit;
424 lvit.iSubItem = 1;// 指定要设置第1个专栏的文本
425 wsprintf(szID,"%u",te32.th32OwnerProcessID );// 要设置的文本
426 lvit.pszText = szID ;
427 ::SendMessage(hWndThread, LVM_SETITEMTEXT, nIndexThread, (LPARAM)&lvit);
428
429 lvit.iSubItem = 2;
430 wsprintf(szID,"%u",te32.tpBasePri);
431 lvit.pszText = szID;
432 ::SendMessage(hWndThread, LVM_SETITEMTEXT, nIndexThread, (LPARAM)&lvit);
433
434 nIndexThread++;//下一行
435 }
436
437 }while(::Thread32Next (hThread,&te32));
438
439 }
440 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
441 ////////////内存使用对话框
442 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
443 LRESULT CALLBACK MemoryProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
444 {
445 MEMORYSTATUS ms;
446 char Buffer[1024];
447 switch(uMsg)
448 {
449 case WM_INITDIALOG:
450 ::SetTimer(hwnd,10,1000,NULL);//设置一个定时器
451 ::SetWindowPos (hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//置顶
452 return true;
453 case WM_CLOSE:
454 ::KillTimer (hwnd,10);//删除定时器并结束对话框
455 ::EndDialog (hwnd,0);
456 return true;
457 case WM_TIMER:
458 ::GlobalMemoryStatus (&ms);
459 wsprintf(Buffer,"%u MB",(ms.dwTotalPhys/1024)/1024 );//物理内存总量
460 ::SetDlgItemText (hwnd,IDC_STATIC_TOTALPHY,Buffer);
461 wsprintf(Buffer,"%u MB",(ms.dwAvailPhys /1024)/1024);//可用物理内存
462 ::SetDlgItemText (hwnd,IDC_STATIC_PHYCANUSE,Buffer);
463 wsprintf(Buffer,"%u MB",(ms.dwTotalVirtual /1024)/1024);//虚拟内存总量
464 ::SetDlgItemText (hwnd,IDC_STATIC_TOTALVIR,Buffer);
465 wsprintf(Buffer,"%u MB",(ms.dwAvailVirtual /1024)/1024);//可用虚拟内存
466 ::SetDlgItemText (hwnd,IDC_STATIC_VIRCANUSE,Buffer);
467 wsprintf(Buffer,"%u %%",ms.dwMemoryLoad );//内存使用百分比
468 ::SetDlgItemText (hwnd,IDC_STATIC_USED,Buffer);
469 return true;
470 case WM_COMMAND:
471 if(LOWORD(wParam) == IDOK)
472 {
473 ::KillTimer (hwnd,10);//删除定时器并结束对话框
474 ::EndDialog (hwnd,0);
475 }
476 return true;
477 }
478 return false;
479 }
480 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
481 ///////////线程信息对话框
482 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
483 LRESULT CALLBACK ThreadProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
484 {
485 HWND hWndListThread;
486 switch(uMsg)
487 {
488 case WM_INITDIALOG:
489 ::SetWindowPos (hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//置顶
490 // 初始化列表视图控件
491 hWndListThread = ::GetDlgItem(hWnd, IDC_THREAD);
492 // 设置它的扩展风格
493 ::SendMessage(hWndListThread, LVM_SETEXTENDEDLISTVIEWSTYLE,
494 0, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
495 LVCOLUMN column;
496 // 指定LVCOLUMN结构中的pszText、fmt、cx域有效
497 column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
498 // 设置有效的域的属性
499 column.fmt = LVCFMT_CENTER; // 指定文本居中显示
500 column.cx = 50; // 指定此栏的宽度
501 column.pszText = "线程ID"; // 指定此栏显示的文本
502 // 添加一个新的专栏
503 ::SendMessage(hWndListThread, LVM_INSERTCOLUMN, 0, (LPARAM)&column);
504 // 再添加一个专栏
505 column.pszText = "所属进程";
506 column.cx = 80;
507 ::SendMessage(hWndListThread, LVM_INSERTCOLUMN, 1, (LPARAM)&column);
508
509 column.pszText = "优先级";
510 column.cx = 80;
511 ::SendMessage (hWndListThread,LVM_INSERTCOLUMN,3,(LPARAM)&column);
512
513 UpdateThread(hWnd);
514 return true;
515 case WM_CLOSE:
516 ::EndDialog (hWnd,0);
517 return true;
518 case WM_COMMAND:
519 {
520 switch(LOWORD(wParam))
521 {
522 case IDCANCEL:
523 ::EndDialog (hWnd,0);
524 break;
525 case IDC_UPTHREAD:
526 UpdateThread(hWnd);
527 break;
528 }
529 }
530 return true;
531 case WM_NOTIFY:
532 if(wParam == IDC_THREAD)//如果是进程列表控件
533 {
534 char szID[56] = "";
535 NMHDR* pHeader = (NMHDR*)lParam;
536 HWND hWndList = pHeader->hwndFrom;
537 if(pHeader->code == NM_DBLCLK)
538 {
539 NMLISTVIEW* pNMListView = (NMLISTVIEW*)pHeader;
540 // 用户双击的项号
541 int nIndex = pNMListView->iItem;
542
543 // 取得进程ID号
544 LVITEM lvi; //条目结构
545 memset(&lvi, 0, sizeof(LVITEM));//清空
546 lvi.iSubItem = 0;
547 lvi.cchTextMax = 56;
548 lvi.pszText = szID;
549 //得到进程名
550 ::SendMessage(hWndList, LVM_GETITEMTEXT, (WPARAM)nIndex, (long)&lvi);
551 if(::MessageBox(hWnd, "确实要终止线程吗?",
552 "Info", MB_OKCANCEL|MB_DEFBUTTON2) == IDCANCEL)
553 return 0;
554
555 // 打开目标进程,终止它
556 HANDLE hThread = OpenThread (THREAD_ALL_ACCESS, false, (DWORD)atoi(szID));
557 if(hThread != NULL)
558 {
559 if(::TerminateThread (hThread, 0))// 结束进程
560 {
561 ::Sleep (50); //休息005秒
562 UpdateThread(hWnd);;//更新线程列表
563 }
564 }
565 }
566 }
567 return true;
568 }
569 return false;
570 }
571 代码排版果然很累,汗!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: