爲了熟悉一下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 代碼排版果然很累,汗!