VC查看系统进程ID,终止进程的程序源码

16 篇文章 0 订阅
15 篇文章 0 订阅

  1. // ProcessDlg.cpp : implementation file   
  2. //   
  3.    
  4. #include "stdafx.h"   
  5. #include "Process.h"   
  6. #include "ProcessDlg.h"   
  7.    
  8. #include<tlhelp32.h>   
  9. #include "InfoDlg.h"   
  10.    
  11. #ifdef _DEBUG   
  12. #define new DEBUG_NEW   
  13. #undef THIS_FILE   
  14. static char THIS_FILE[] = __FILE__;   
  15. #endif   
  16.    
  17. #define WM_TRAY WM_USER+12   
  18.   
  19. // CProcessDlg dialog   
  20.    
  21. CProcessDlg::CProcessDlg(CWnd* pParent /*=NULL*/)   
  22.     : CDialog(CProcessDlg::IDD, pParent)   
  23. {   
  24.     //{{AFX_DATA_INIT(CProcessDlg)   
  25.         // NOTE: the ClassWizard will add member initialization here   
  26.     //}}AFX_DATA_INIT   
  27.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32   
  28.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
  29. }   
  30.    
  31. void CProcessDlg::DoDataExchange(CDataExchange* pDX)   
  32. {   
  33.     CDialog::DoDataExchange(pDX);   
  34.     //{{AFX_DATA_MAP(CProcessDlg)   
  35.     DDX_Control(pDX, IDC_LIST1, m_ListCtrl);   
  36.     //}}AFX_DATA_MAP   
  37. }   
  38.    
  39. BEGIN_MESSAGE_MAP(CProcessDlg, CDialog)   
  40.     //{{AFX_MSG_MAP(CProcessDlg)   
  41.     ON_WM_PAINT()   
  42.     ON_WM_QUERYDRAGICON()   
  43.     ON_BN_CLICKED(IDC_REFRESH, OnRefresh)   
  44.     ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickList1)   
  45.     ON_COMMAND(ID_MENU_INFO, OnMenuInfo)   
  46.     ON_BN_CLICKED(IDC_KILL, OnKill)   
  47.     ON_WM_TIMER()   
  48.     ON_WM_CTLCOLOR()   
  49.     //}}AFX_MSG_MAP   
  50. END_MESSAGE_MAP()   
  51.    
  52.   
  53. // CProcessDlg message handlers   
  54.    
  55. BOOL CProcessDlg::OnInitDialog()   
  56. {   
  57.     CDialog::OnInitDialog();   
  58.    
  59.     // Set the icon for this dialog.  The framework does this automatically   
  60.     //  when the application's main window is not a dialog   
  61.     SetIcon(m_hIcon, TRUE);         // Set big icon   
  62.     SetIcon(m_hIcon, FALSE);        // Set small icon   
  63.        
  64.     // TODO: Add extra initialization here   
  65.         m_ListCtrl.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);   
  66.     ListView_SetExtendedListViewStyle(m_ListCtrl.m_hWnd,    
  67.         LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT  );   
  68.     //在列表控件中添加图标   
  69.     m_imageList.Create(IDB_BITMAP1,16,1,RGB(255,0,255));   
  70.     m_ListCtrl.SetImageList(&m_imageList,LVSIL_SMALL);   
  71.     //初始化列表控件   
  72.     m_ListCtrl.InsertColumn(0,"Image Name",LVCFMT_LEFT,120,0);   
  73.     m_ListCtrl.InsertColumn(1,"ProID",LVCFMT_CENTER,88,1);   
  74.     m_ListCtrl.InsertColumn(2,"Parent ProID",LVCFMT_CENTER,88,2);   
  75.    
  76.        
  77.    
  78.     SetTimer(1,20000,NULL);   
  79.     refresh();   
  80.        
  81.     return TRUE;  // return TRUE  unless you set the focus to a control   
  82. }   
  83.    
  84. // If you add a minimize button to your dialog, you will need the code below   
  85. //  to draw the icon.  For MFC applications using the document/view model,   
  86. //  this is automatically done for you by the framework.   
  87.    
  88. void CProcessDlg::OnPaint()    
  89. {   
  90.     if (IsIconic())   
  91.     {   
  92.         CPaintDC dc(this); // device context for painting   
  93.    
  94.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);   
  95.    
  96.         // Center icon in client rectangle   
  97.         int cxIcon = GetSystemMetrics(SM_CXICON);   
  98.         int cyIcon = GetSystemMetrics(SM_CYICON);   
  99.         CRect rect;   
  100.         GetClientRect(&rect);   
  101.         int x = (rect.Width() - cxIcon + 1) / 2;   
  102.         int y = (rect.Height() - cyIcon + 1) / 2;   
  103.    
  104.         // Draw the icon   
  105.         dc.DrawIcon(x, y, m_hIcon);   
  106.     }   
  107.     else   
  108.     {   
  109.         CDialog::OnPaint();   
  110.     }   
  111. }   
  112.    
  113. // The system calls this to obtain the cursor to display while the user drags   
  114. //  the minimized window.   
  115. HCURSOR CProcessDlg::OnQueryDragIcon()   
  116. {   
  117.     return (HCURSOR) m_hIcon;   
  118. }   
  119.    
  120. void CProcessDlg::OnRefresh()    
  121. {   
  122.     refresh();   
  123. }   
  124.    
  125. void CProcessDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)    
  126. {   
  127.     // TODO: Add your control notification handler code here   
  128.     CMenu menu;CPoint pt;   
  129.     menu.LoadMenu(IDR_MENU1);   
  130.     GetCursorPos(&pt);   
  131.     menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON   
  132.                |TPM_RIGHTBUTTON, pt.x, pt.y,this, NULL);   
  133.     *pResult = 0;   
  134. }   
  135.    
  136. void CProcessDlg::OnMenuInfo()    
  137. {   
  138.     // TODO: Add your command handler code here   
  139.     CInfoDlg dlg;   
  140.     CString str,strTemp;   
  141.     int selItem=m_ListCtrl.GetNextItem(-1,LVIS_SELECTED);   
  142.        
  143.     if(selItem>-1)   
  144.     {   
  145.         strTemp=m_ListCtrl.GetItemText(selItem,1);   
  146.            
  147.         HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   
  148.            
  149.         PROCESSENTRY32 ProcessInfo;//声明进程信息变量   
  150.         ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小   
  151.         //返回系统中第一个进程的信息   
  152.         BOOL Status=Process32First(SnapShot,&ProcessInfo);   
  153.         int m_nProcess=0;   
  154.         while(Status)   
  155.         {   
  156.             m_nProcess++;   
  157.                
  158.             str.Format("%04x",ProcessInfo.th32ProcessID);   
  159.             if(str==strTemp)   
  160.             {   
  161.                 dlg.dwSize=ProcessInfo.dwSize;   
  162.                 dlg.cntUsage=ProcessInfo.cntUsage;   
  163.                 dlg.processID=ProcessInfo.th32ProcessID;   
  164.                 dlg.defaultHeapID=ProcessInfo.th32DefaultHeapID;   
  165.                 dlg.moduleID=ProcessInfo.th32ModuleID;   
  166.                 dlg.cntThreads=ProcessInfo.cntThreads;   
  167.                 dlg.parentProcessID=ProcessInfo.th32ParentProcessID;   
  168.                 dlg.classBase=ProcessInfo.pcPriClassBase;   
  169.                 dlg.dwFlags=ProcessInfo.dwFlags;   
  170.                 dlg.m_strExeFile=ProcessInfo.szExeFile;   
  171.                 TRACE("--------------%s/n",dlg.m_strExeFile);   
  172.                 break;   
  173.             }   
  174.             //获取下一个进程的信息   
  175.             Status=Process32Next(SnapShot,&ProcessInfo);   
  176.         }   
  177.         CloseHandle(SnapShot);   
  178.         dlg.DoModal();   
  179.     }   
  180.     else   
  181.     {   
  182.         MessageBox("Please select the list item");   
  183.     }      
  184. }   
  185.    
  186. void CProcessDlg::OnKill()    
  187. {   
  188.     // TODO: Add your control notification handler code here   
  189.     
  190.     CString str,strTemp;   
  191.     int CurItem=m_ListCtrl.GetNextItem(-1,LVIS_SELECTED);   
  192.     strTemp=m_ListCtrl.GetItemText(CurItem,1);   
  193.     HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   
  194.     PROCESSENTRY32 ProcessInfo;//声明进程信息变量   
  195.     ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小   
  196.     //返回系统中第一个进程的信息   
  197.     BOOL Status=Process32First(SnapShot,&ProcessInfo);   
  198.     int m_nProcess=0;   
  199.     while(Status)   
  200.     {   
  201.         m_nProcess++;   
  202.         str.Format("%04x",ProcessInfo.th32ProcessID);   
  203.         if(str==strTemp)   
  204.         {   
  205.             if((AfxMessageBox("Do you really want to kill the process?",MB_OKCANCEL|MB_DEFBUTTON2))==IDOK)   
  206.             {   
  207.                 HANDLE hProcess= OpenProcess( PROCESS_ALL_ACCESS, FALSE,ProcessInfo.th32ProcessID);   
  208.                 if(::TerminateProcess(hProcess,1))   
  209.                 {   
  210.                     AfxMessageBox(" The process has been successfully killed");   
  211.                     refresh() ;   
  212.                 }   
  213.                 else   
  214.                     AfxMessageBox("Sorry, The process is not killed");   
  215.                 CloseHandle(hProcess);   
  216.             }   
  217.             break;   
  218.         }   
  219.         //获取下一个进程的信息   
  220.         Status=Process32Next(SnapShot,&ProcessInfo);   
  221.     }      
  222.     CloseHandle(SnapShot);     
  223. }   
  224.    
  225. void CProcessDlg::OnTimer(UINT nIDEvent)    
  226. {   
  227.     // TODO: Add your message handler code here and/or call default   
  228.     refresh();     
  229.     CDialog::OnTimer(nIDEvent);   
  230. }   
  231.    
  232. HBRUSH CProcessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)    
  233. {   
  234.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);   
  235.     if(nCtlColor==CTLCOLOR_STATIC)   
  236.     {   
  237.         pDC->SetTextColor(RGB(0,0,0));   
  238.         pDC->SetBkColor(RGB(160,180,220));   
  239.         HBRUSH br=CreateSolidBrush(RGB(160,180,235));   
  240.         return br;   
  241.     }   
  242.     else if(nCtlColor==CTLCOLOR_DLG)   
  243.     {   
  244.         pDC->SetTextColor(RGB(0,0,0));   
  245.         pDC->SetBkColor(RGB(160,180,220));   
  246.         HBRUSH br=CreateSolidBrush(RGB(160,180,235));   
  247.         return br;   
  248.     }   
  249.     return hbr;   
  250. }   
  251.    
  252. BOOL CProcessDlg::refresh()   
  253. {   
  254.         //获取系统中的所有进程信息   
  255.     m_ListCtrl.DeleteAllItems();   
  256.     HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   
  257.     if(SnapShot==NULL)   
  258.     {   
  259.         MessageBox("Fail to take a snapshot of the processes!!");   
  260.         return FALSE;   
  261.     }   
  262.    
  263.     int nIndex;   
  264.     CString str;   
  265.     PROCESSENTRY32 ProcessInfo;//定义进程信息变量   
  266.    
  267.     ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小   
  268.     //获得系统中第一个进程的信息   
  269.     BOOL Status=Process32First(SnapShot,&ProcessInfo);   
  270.     int m_nProcess=0;   
  271.     while(Status)   
  272.     {   
  273.         m_nProcess++;   
  274.    
  275.         //在列表控件中添加进程名称   
  276.         nIndex=m_ListCtrl.InsertItem(m_nProcess,ProcessInfo.szExeFile);   
  277.         //在列表控件中添加进程ID   
  278.         str.Format("%04x",ProcessInfo.th32ProcessID);   
  279.         m_ListCtrl.SetItemText(nIndex,1,str);   
  280.         //在列表控制件中添加进程的父进程   
  281.         str.Format("%04x",ProcessInfo.th32ParentProcessID);   
  282.         m_ListCtrl.SetItemText(nIndex,2,str);   
  283.            
  284.         //获取下一个进程的信息   
  285.         Status=Process32Next(SnapShot,&ProcessInfo);   
  286.     }   
  287.     CloseHandle(SnapShot);   
  288.        
  289.        
  290.     UpdateData(false);   
  291.     return TRUE;   
  292.    
  293. }   
  294.    
  295.    
  296.    
  297. void CProcessDlg::addTray()   
  298. {   
  299.         NOTIFYICONDATA tnd;   
  300.         tnd.cbSize=sizeof(NOTIFYICONDATA);   
  301.         tnd.hWnd=this->m_hWnd;   
  302.         tnd.uID=IDI_ICON1;   
  303.         tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;   
  304.         tnd.uCallbackMessage=WM_TRAY;//    
  305.         tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));   
  306.         strcpy(tnd.szTip,"屏蔽系统鼠标右健程序,双击图标弹出窗口");//图标提示为"测试程序"   
  307.         Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标   
  308. }   
  309.    
  310. void CProcessDlg::delTray()   
  311. {   
  312.         NOTIFYICONDATA tnd;   
  313.         tnd.cbSize=sizeof(NOTIFYICONDATA);   
  314.         tnd.hWnd=this->m_hWnd;   
  315.         tnd.uID=IDI_ICON1;   
  316.         tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;   
  317.         tnd.uCallbackMessage=NULL;//    
  318.         tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));   
  319.         strcpy(tnd.szTip,"屏蔽系统鼠标右健程序,双击图标弹出窗口");//图标提示为"测试程序"   
  320.         Shell_NotifyIcon(NIM_DELETE,&tnd);//向任务栏添加图标   
  321. }   
  322.    
  323. LRESULT CProcessDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   
  324. {   
  325.     // TODO: Add your specialized code here and/or call the base class   
  326.     switch(message)   
  327.         {   
  328.             case WM_SYSCOMMAND:   
  329.                 if(wParam==SC_MINIMIZE)   
  330.                 {   
  331.                     addTray();   
  332.                     ShowWindow(SW_HIDE);   
  333.                     return 0;   
  334.                 }   
  335.                 break;   
  336.             case WM_TRAY:   
  337.                 if(lParam==WM_RBUTTONUP||lParam==WM_LBUTTONUP)   
  338.                 {   
  339.                     ShowWindow(SW_SHOW);   
  340.                     delTray();   
  341.                 }   
  342.                 break;   
  343.             }          
  344.        
  345.     return CDialog::WindowProc(message, wParam, lParam);   
  346.    
  347. }   
  348. </tlhelp32.h>  

http://read.pudn.com/downloads105/sourcecode/windows/system/433717/Process/ProcessDlg.cpp__.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值