正文

进程查看-ProcessInfoDlg2006-10-12 10:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/19239.html

分享到:

//////////////////////////////////////////////
// InfoDlg.h : header file

#if !defined(AFX_INFODLG_H__DCEFCEEC_BB17_45D2_ABB1_EEFA7805B27C__INCLUDED_)
#define AFX_INFODLG_H__DCEFCEEC_BB17_45D2_ABB1_EEFA7805B27C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


/////////////////////////////////////////////////////////////////////////////
// CInfoDlg dialog

class CInfoDlg : public CDialog
{

// Construction
public:
    CInfoDlg(CWnd* pParent = NULL);   // standard constructor
   
    DWORD dwSize,cntUsage,processID,defaultHeapID,moduleID,cntThreads,parentProcessID,dwFlags;
    long classBase;
// Dialog Data
    //{{AFX_DATA(CInfoDlg)
    enum { IDD = IDD_INFORMATION };
    CString    m_strExeFile;
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CInfoDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:

    // Generated message map functions
    //{{AFX_MSG(CInfoDlg)
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_INFODLG_H__DCEFCEEC_BB17_45D2_ABB1_EEFA7805B27C__INCLUDED_)


//////////////////////////////////////////////////////

// processDlg.cpp : implementation file
//

#include "stdafx.h"
#include "process.h"
#include "processDlg.h"

#include<Tlhelp32.h>
#include "InfoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_TRAY WM_USER+12

/////////////////////////////////////////////////////////////////////////////
// CProcessDlg dialog

CProcessDlg::CProcessDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProcessDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CProcessDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CProcessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProcessDlg)
DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CProcessDlg, CDialog)
//{{AFX_MSG_MAP(CProcessDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickList1)
ON_COMMAND(ID_MENU_INFO, OnMenuInfo)
ON_BN_CLICKED(IDC_KILL, OnKill)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProcessDlg message handlers

BOOL CProcessDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);   // Set big icon
SetIcon(m_hIcon, FALSE);  // Set small icon

// TODO: Add extra initialization here
m_ListCtrl.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
ListView_SetExtendedListViewStyle(m_ListCtrl.m_hWnd,
  LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT  );
//在列表控件中添加图标
m_imageList.Create(IDB_BITMAP1,16,1,RGB(255,0,255));
m_ListCtrl.SetImageList(&m_imageList,LVSIL_SMALL);
//初始化列表控件
m_ListCtrl.InsertColumn(0,"Image Name",LVCFMT_LEFT,120,0);
m_ListCtrl.InsertColumn(1,"ProID",LVCFMT_CENTER,88,1);
m_ListCtrl.InsertColumn(2,"Parent ProID",LVCFMT_CENTER,88,2);



SetTimer(1,20000,NULL);
refresh();

return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CProcessDlg::OnPaint()
{
if (IsIconic())
{
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
}
else
{
  CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CProcessDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

BOOL CProcessDlg::refresh()
{
//获取系统中的所有进程信息
m_ListCtrl.DeleteAllItems();
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(SnapShot==NULL)
{
  MessageBox("Fail to take a snapshot of the processes!!");
  return FALSE;
}

int nIndex;
CString str;
PROCESSENTRY32 ProcessInfo;//定义进程信息变量

ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小
//获得系统中第一个进程的信息
BOOL Status=Process32First(SnapShot,&ProcessInfo);
int m_nProcess=0;
while(Status)
{
  m_nProcess++;

  //在列表控件中添加进程名称
  nIndex=m_ListCtrl.InsertItem(m_nProcess,ProcessInfo.szExeFile);
  //在列表控件中添加进程ID
  str.Format("%04x",ProcessInfo.th32ProcessID);
  m_ListCtrl.SetItemText(nIndex,1,str);
  //在列表控制件中添加进程的父进程
  str.Format("%04x",ProcessInfo.th32ParentProcessID);
  m_ListCtrl.SetItemText(nIndex,2,str);
 
  //获取下一个进程的信息
  Status=Process32Next(SnapShot,&ProcessInfo);
}
CloseHandle(SnapShot);


UpdateData(false);
return TRUE;
}

void CProcessDlg::addTray()
{
  NOTIFYICONDATA tnd;
  tnd.cbSize=sizeof(NOTIFYICONDATA);
  tnd.hWnd=this->m_hWnd;
  tnd.uID=IDI_ICON1;
  tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
  tnd.uCallbackMessage=WM_TRAY;//
  tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  strcpy(tnd.szTip,"屏蔽系统鼠标右健程序,双击图标弹出窗口");//图标提示为"测试程序"
  Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标

}

void CProcessDlg::delTray()
{
  NOTIFYICONDATA tnd;
  tnd.cbSize=sizeof(NOTIFYICONDATA);
  tnd.hWnd=this->m_hWnd;
  tnd.uID=IDI_ICON1;
  tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
  tnd.uCallbackMessage=NULL;//
  tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  strcpy(tnd.szTip,"屏蔽系统鼠标右健程序,双击图标弹出窗口");//图标提示为"测试程序"
  Shell_NotifyIcon(NIM_DELETE,&tnd);//向任务栏添加图标
}

LRESULT CProcessDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
  {
   case WM_SYSCOMMAND:
    if(wParam==SC_MINIMIZE)
    {
     addTray();
     ShowWindow(SW_HIDE);
     return 0;
    }
    break;
   case WM_TRAY:
    if(lParam==WM_RBUTTONUP||lParam==WM_LBUTTONUP)
    {
     ShowWindow(SW_SHOW);
      delTray();
    }
    break;
   } 

return CDialog::WindowProc(message, wParam, lParam);
}

void CProcessDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here

CMenu menu;CPoint pt;
menu.LoadMenu(IDR_MENU1);
GetCursorPos(&pt);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON
      |TPM_RIGHTBUTTON, pt.x, pt.y,this, NULL);
*pResult = 0;

}

void CProcessDlg::OnMenuInfo()
{
// TODO: Add your command handler code here
CInfoDlg dlg;
CString str,strTemp;
int selItem=m_ListCtrl.GetNextItem(-1,LVIS_SELECTED);

if(selItem>-1)
{
  strTemp=m_ListCtrl.GetItemText(selItem,1);
 
  HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 
  PROCESSENTRY32 ProcessInfo;//声明进程信息变量
  ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小
  //返回系统中第一个进程的信息
  BOOL Status=Process32First(SnapShot,&ProcessInfo);
  int m_nProcess=0;
  while(Status)
  {
   m_nProcess++;
  
   str.Format("%04x",ProcessInfo.th32ProcessID);
   if(str==strTemp)
   {
    dlg.dwSize=ProcessInfo.dwSize;
    dlg.cntUsage=ProcessInfo.cntUsage;
    dlg.processID=ProcessInfo.th32ProcessID;
    dlg.defaultHeapID=ProcessInfo.th32DefaultHeapID;
    dlg.moduleID=ProcessInfo.th32ModuleID;
    dlg.cntThreads=ProcessInfo.cntThreads;
    dlg.parentProcessID=ProcessInfo.th32ParentProcessID;
    dlg.classBase=ProcessInfo.pcPriClassBase;
    dlg.dwFlags=ProcessInfo.dwFlags;
    dlg.m_strExeFile=ProcessInfo.szExeFile;
    TRACE("--------------%s\n",dlg.m_strExeFile);
    break;
   }
   //获取下一个进程的信息
   Status=Process32Next(SnapShot,&ProcessInfo);
  }
  CloseHandle(SnapShot);
  dlg.DoModal();
}
else
{
  MessageBox("Please select the list item");
}

}



void CProcessDlg::OnKill()
{
// TODO: Add your control notification handler code here

CString str,strTemp;
int CurItem=m_ListCtrl.GetNextItem(-1,LVIS_SELECTED);
strTemp=m_ListCtrl.GetItemText(CurItem,1);
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 ProcessInfo;//声明进程信息变量
ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小
//返回系统中第一个进程的信息
BOOL Status=Process32First(SnapShot,&ProcessInfo);
int m_nProcess=0;
while(Status)
{
  m_nProcess++;
  str.Format("%04x",ProcessInfo.th32ProcessID);
  if(str==strTemp)
  {
   if((AfxMessageBox("Do you really want to kill the process?",MB_OKCANCEL|MB_DEFBUTTON2))==IDOK)
   {
    HANDLE hProcess= OpenProcess( PROCESS_ALL_ACCESS, FALSE,ProcessInfo.th32ProcessID);
    if(::TerminateProcess(hProcess,1))
    {
     AfxMessageBox(" The process has been successfully killed");
     refresh() ;
    }
    else
     AfxMessageBox("Sorry, The process is not killed");
    CloseHandle(hProcess);
   }
   break;
  }
  //获取下一个进程的信息
  Status=Process32Next(SnapShot,&ProcessInfo);
}
CloseHandle(SnapShot);

}

void CProcessDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default

refresh();
CDialog::OnTimer(nIDEvent);
}

void CProcessDlg::OnRefresh()
{
// TODO: Add your control notification handler code here
refresh();
}

HBRUSH CProcessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_STATIC)
{
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(160,180,220));
  HBRUSH br=CreateSolidBrush(RGB(160,180,235));
  return br;
}
else if(nCtlColor==CTLCOLOR_DLG)
{
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(160,180,220));
  HBRUSH br=CreateSolidBrush(RGB(160,180,235));
  return br;
}
return hbr;
}


阅读(2637) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册