ToolHelp系列函數使用總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章