天天看點

C++、MFC建立程序管理器的代碼

#include "stdio.h"

#include "Process.h"

#include "stdafx.h"

#include "程序管理.h"

#include "程序管理Dlg.h"

#include "tlhelp32.h"

#include<windows.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

 CAboutDlg();

// Dialog Data

 //{{AFX_DATA(CAboutDlg)

 enum { IDD = IDD_ABOUTBOX };

 //}}AFX_DATA

 // ClassWizard generated virtual function overrides

 //{{AFX_VIRTUAL(CAboutDlg)

 protected:

 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

 //}}AFX_VIRTUAL

// Implementation

protected:

 //{{AFX_MSG(CAboutDlg)

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

 //{{AFX_DATA_INIT(CAboutDlg)

 //}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CAboutDlg)

 //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

 //{{AFX_MSG_MAP(CAboutDlg)

  // No message handlers

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()

/

// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent )

 : CDialog(CMyDlg::IDD, pParent)

{

 //{{AFX_DATA_INIT(CMyDlg)

 //}}AFX_DATA_INIT

 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMyDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CMyDlg)

 DDX_Control(pDX, ID_VIEW_LIST, m_view);

 DDX_Control(pDX, IDOK, m_ok);

 DDX_Control(pDX, IDC_KILL, m_kill);

 DDX_Control(pDX, IDC_GET, m_get);

 DDX_Control(pDX, IDC_CREAT, m_creat);

 //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

 //{{AFX_MSG_MAP(CMyDlg)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()

 ON_BN_CLICKED(IDC_CREAT, OnCreat)

 ON_BN_CLICKED(IDC_GET, OnGet)

 ON_BN_CLICKED(IDC_KILL, OnKill)

 ON_EN_CHANGE(IDC_EDIT_NUM, OnChangeEditNum)

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()

/

// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()

{

 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.

 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);

 if (pSysMenu != NULL)

 {

  CString strAboutMenu;

  strAboutMenu.LoadString(IDS_ABOUTBOX);

  if (!strAboutMenu.IsEmpty())

  {

   pSysMenu->AppendMenu(MF_SEPARATOR);

   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

  }

 }

 // 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

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

}

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

 if ((nID & 0xFFF0) == IDM_ABOUTBOX)

 {

  CAboutDlg dlgAbout;

  dlgAbout.DoModal();

 }

 else

 {

  CDialog::OnSysCommand(nID, lParam);

 }

}

// 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 CMyDlg::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 CMyDlg::OnQueryDragIcon()

{

 return (HCURSOR) m_hIcon;

}

void CMyDlg::OnCreat()

{

 // TODO: Add your control notification handler code here

 char chPath[301];

 ::GetCurrentDirectory(300,(LPTSTR)chPath);//得到目前目錄

   char path[200]= "//123.exe";

   strcat(chPath,path);

   PROCESS_INFORMATION pi;

   STARTUPINFO   startinfo;  

 memset(&startinfo,0,sizeof(startinfo));  

 startinfo.cb=sizeof(startinfo);  

   ZeroMemory( &pi, sizeof(pi) );

   ZeroMemory( &startinfo, sizeof(startinfo) );

   startinfo.cb = sizeof(startinfo);

   if(!CreateProcess(NULL,"/"regedit",  NULL, NULL, FALSE, 0, NULL, NULL, &startinfo, &pi)){

    AfxMessageBox("建立程序失敗!");//C://Program Files//Internet Explorer//iexplore.exe/"www.yahoo.com

    return;//即将建立指令行cmd程序。

   }

   CMyDlg::OnGet();//注意:這句話用來建立程序後重新整理程序清單。不用手動重新整理。

   MessageBox("建立“regedit系統資料庫程序”成功!");

   CloseHandle( pi.hProcess );

   CloseHandle( pi.hThread );

}

void CMyDlg::OnOK()

{

 // TODO: Add extra validation here

 CDialog::OnOK();//退出按鈕

}

void CMyDlg::OnGet()

{

 // TODO: Add your control notification handler code here

 m_view.ResetContent();

 PROCESSENTRY32 pe32;

    pe32.dwSize=sizeof(pe32);

    HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    BOOL bMore=::Process32First(hProcessSnap,&pe32);

    while(bMore)//周遊程序,擷取并顯示

    {

    int nIndex = m_view.AddString(pe32.szExeFile);

    m_view.SetItemDataPtr(nIndex,new int(pe32.th32ProcessID));

          bMore=::Process32Next(hProcessSnap,&pe32);

    }

    ::CloseHandle(hProcessSnap);

}

void CMyDlg::OnKill()

{

 // TODO: Add your control notification handler code here

 int nIndex = m_view.GetCurSel();//獲得選中的Index

 CString name;

 m_view.GetText(nIndex,name);//獲得選中程序名

 PROCESSENTRY32* processInfo=new PROCESSENTRY32;

 processInfo->dwSize=sizeof(PROCESSENTRY32);

 PROCESSENTRY32 id;//定義結束程序的ID

    id.dwSize=sizeof(id);

    HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    BOOL bMore=::Process32First(hProcessSnap,&id);

 MessageBox("你要結束/""+name+"/"程序嗎!");

    while(bMore)//篩選要結束的ID

    {

  if(id.szExeFile == name){

   HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id.th32ProcessID);

   if(TerminateProcess(hProcess,1)){

    MessageBox("成功結束");

   }

   else

    MessageBox("失敗");

   CloseHandle(hProcess);

   delete processInfo;

   delete(int*)m_view.GetItemDataPtr(nIndex);

   m_view.DeleteString(nIndex);

   }

  bMore=::Process32Next(hProcessSnap,&id);

 }

 ::CloseHandle(hProcessSnap);

}

void CMyDlg::OnChangeEditNum()

{

}

繼續閱讀