ToolHelp系列函数使用总结

C#个人珍藏基础类库分享 — 8、通用工具帮助类ToolHelper 做.NET开发的同学,一套简单易用的基础类库是必不可少的,这里把我混迹C#圈子十余载珍藏的类库分享出来,希望能够给刚踏入开发门槛的朋友一些帮助。C#个人珍藏基础类库分享 — 4、字节数组帮助类BytesObjectHelper。C#个人珍藏基础类库分享 — 1、通用缓存帮助类CacheHelper。C#个人珍藏基础类库分享 — 3、目录、文件帮助类FileHelper。C#个人珍藏基础类库分享 — 8、通用工具帮助类ToolHelper。C#个人珍藏基础类库分享 — 5、日志帮助类LogHelper。 阅读详情

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

[Win32] ToolHelp API 和 进程API 详解 本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 阅读详情

相关推荐

C语言头文件 TLHELP32

C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文件 TLHELP32C语言头文

base64加密解密在线工具大全

可能是迄今为止用过的最好用的base64 加解密工具了,非常方便快捷,上下交换这个有点意思。

qq_30820239的博客 9656

help_tool-main.zip

逆向推理工具

通过ToolHelp函数遍历系统所有进程

void GetTheProcess() { //PROCESSENTRY32结构体,保存进程具体信息 PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); //获得系统进程快照的句柄 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { return ; } //首.

cfz751740465的博客 271

C#帮助工具类整理--FileHelper、XmlHelper、ToolHelper

C#帮助工具类整理

Zhaof_Notes 2643

Toolhelp API 简介

Toolhelp APIs是Windows中一组能够方便得到系统中win32应用程序的当前运行状况的函数,这些函数设计目的是实现一些基于Win32子系统的工具,特别是调试器。通过使用Toolhelp API,我们可以实现象Windows附带的系统工具Dr watson一样的功能(当然真正实现它的所有功能不是光靠Toolhelp API一个函数库就可以的)。而且这些函数适用于win9x,winnt,

狼窝 3587

枚举进程的函数ToolHelp32、EnumProcesses

ToolHelp32、EnumProcesses 摘要 我们在编写程序时,常常遇到的一件事情就是要准确列出系统中所有正在运行的程序或者进程。Windows 任务管理器就是这样的一个程序。它既能列出运行的桌面应用程序,又能列出系统中所有运行的进程。那么,我们在程序中如何实现这样的任务呢?本文下面将详细 讨论这个问题。枚举顶层(top-level)窗口 ...

939

进程的控制——获取系统进程信息

获取系统进程 ToolHelp函数; CreateToolhelp32Snapshot函数获取当前系统内执行的进程拍快照(Snapshot),即获得进程列表; Process32First函数和Process32Next函数遍历列表; 快照头文件:#include&lt;tlhelp32.h&gt; #include&lt;Windows.h&gt; #include&lt;tlhelp...

TxyITxs的博客 1009

一个简单的任务管理器(转帖)

主要需要使用ToolHelp相关函数来列举进程,用OpenProcess可以操作进程,终止进程,列举进程的线程等等。 列举进程代码 hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(hSnap!=INVALID_HANDLE_VALUE) { PROCESSEN...

weixin_30496431的博客 80

aardio获取process 的进程

废话不多说 直接开干!

weixin_37254196的博客 55

Toolhelp函数

<br />Toolhelp APIs(tlhelp32.h)是Windows中一组能够方便得到系统中win32应用程序的当前运行状况的函数,这些函数设计目的是实现一些基于Win32子系统的工具,特别是调试器。通过使用Toolhelp API,我们可以实现象Windows附带的系统工具Dr watson一样的功能(当然真正实现它的所有功能不是光靠Toolhelp API一个函数库就可以的)。而且这些函数适用于win9x,winnt,win2k,所以不需要为在不同的windows版本中移植代码操心。 <br

———Code_Geass——— 954

ExiftoolHelper 自用工具

exiftool写入中文元数据的时候会吞字,很烦所以自己写了个工具。

使用 ToolHelp32 库枚举进程

  ToolHelp32 库函数在 KERNEL32.dll 中,它们都是标准的 API 函数。但是 Windows NT 4.0 不提供这些函。  ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32N

冷秋魂的专栏 1761

使用 ToolHelp32 库枚举进程(转)

ToolHelp32 库函数在 KERNEL32.dll 中,它们都是标准的 API 函数。但是 Windows NT 4.0 不提供这些函。  ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。

gxj1680的专栏 985

ToolHelp32 函数

ToolHelp32 库函数在 KERNEL32.dll 中,它们都是标准的 API 函数。但是 Windows NT 4.0 不提供这些函。 ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。 其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()

fjclc2008的专栏 995

列举 Windows 所有进程(ToolHelp

引子 由于这阵子必须得做几个小东西才行,估计着呢,是要做个 Windows 的任务管理器出来才行, 但是在功能上呢,又必须得比 Windows 任务管理器强大一点, 说实在的,在 Windows 7 里面的 Windows 任务管理器在功能上已经很强大了, 而我这里说的强大一点呢,并不是说要在功能上比 Windows 7 的任务管理器还有多一些, 而是在仿照 Windows 任务管理器的...

weixin_34297704的博客 228

Toolhelp简单方便地使用方法

摘自windows核心编程Toolhelp.h,注意Toolhelp.h包含的头文件CmnHdr.h中要稍作修改,注释掉: #pragma comment(linker, "/nodefaultlib:oldnames.lib") 否则可能会出现某些老的函数找不到的链接错误。 示例代码:    CToolhelp thProcesses(TH32CS_SNAPPROCES...

weixin_34199405的博客 381

好用工具推荐

https://www.pdf2go.com/zh (liyufeng亲测好用)

CSDN_liwaerduo的博客 481
上一篇: JBuilder2006打包的PE文件
下一篇: 360安全卫士开源,接受各界人士的监督
thinkSJ
博客等级 码龄20年 7粉丝 46原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值