⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processkillerdlg.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// ProcessKillerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ProcessKiller.h"
#include "ProcessKillerDlg.h"
#include "AboutDlg.h"
#include "Tlhelp32.h"
#include "SetParamDlg.h"
#include <process.h>
#include "LogFile.h"

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

/////////////////////////////////////////////////////////////////////////////
// CProcessKillerDlg dialog

CProcessKillerDlg::CProcessKillerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CProcessKillerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CProcessKillerDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);\
	m_pkParamList=NULL;
}

void CProcessKillerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProcessKillerDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CProcessKillerDlg, CDialog)
	//{{AFX_MSG_MAP(CProcessKillerDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()
	ON_COMMAND(ID_QUIT, OnQuit)
	ON_COMMAND(ID_ABOUT, OnAbout)
	ON_COMMAND(ID_SETTING, OnSetting)
	ON_COMMAND(ID_START, OnStart)
	ON_COMMAND(ID_STOP, OnStop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProcessKillerDlg message handlers

BOOL CProcessKillerDlg::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
	
	//隐藏任务栏按钮
	ShowWindow(SW_MINIMIZE);
	ShowWindow(SW_HIDE);
	long dwExstyle=::GetWindowLong(m_hWnd,GWL_EXSTYLE);
	dwExstyle&=~WS_EX_APPWINDOW;
	dwExstyle|=WS_EX_TOOLWINDOW;
	::SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExstyle);
	ShowWindow(SW_SHOWNA);

	//在托盘区添加图标
	AddNotifyIcon(IDR_MAINFRAME,"ProcessKiller Loading...");

	m_bRunning=StartThread();
	
	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 CProcessKillerDlg::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 CProcessKillerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//在托盘区显示图标
BOOL CProcessKillerDlg::AddNotifyIcon(UINT Icon,LPCTSTR sztip, UINT ID)
{
    HICON hIcon;
	hIcon=AfxGetApp()->LoadIcon(Icon);
	NOTIFYICONDATA idata;
	idata.cbSize=sizeof(NOTIFYICONDATA);
	idata.hIcon=hIcon;
	CWnd *pWnd=AfxGetMainWnd();
	idata.hWnd=GetSafeHwnd();
	strcpy(idata.szTip,sztip);
	idata.uCallbackMessage=MYWM_NOTIFYICON;
	idata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	idata.uID=ID;
   	return Shell_NotifyIcon(NIM_ADD,&idata);
}

//在托盘区删除图标
BOOL CProcessKillerDlg::DeleteNotifyIcon(UINT Icon,LPCTSTR sztip, UINT ID)
{
	HICON hIcon;
	hIcon=AfxGetApp()->LoadIcon(Icon);
 	NOTIFYICONDATA idata;
	idata.cbSize=sizeof(NOTIFYICONDATA);
	idata.hIcon=hIcon;
	CWnd *pWnd=AfxGetMainWnd();
	idata.hWnd=GetSafeHwnd();
	strcpy(idata.szTip,sztip);
	idata.uCallbackMessage=MYWM_NOTIFYICON;
	idata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	idata.uID=ID;
   	return Shell_NotifyIcon(NIM_DELETE,&idata);	
}

//在托盘区修改图标
BOOL CProcessKillerDlg::ModifyNotifyIcon(UINT Icon,LPCTSTR sztip, UINT ID)
{
	HICON hIcon;
	hIcon=AfxGetApp()->LoadIcon(Icon);
	NOTIFYICONDATA idata;
	idata.cbSize=sizeof(NOTIFYICONDATA);
	idata.hIcon=hIcon;
	CWnd *pWnd=AfxGetMainWnd();
	idata.hWnd=GetSafeHwnd();
	strcpy(idata.szTip,sztip);
	idata.uCallbackMessage=MYWM_NOTIFYICON;
	idata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	idata.uID=ID;
   	return Shell_NotifyIcon(NIM_MODIFY,&idata);
}

void CProcessKillerDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	DeleteNotifyIcon(IDR_MAINFRAME,"ProcessKiller");	
	
	ResetEvent(m_pkParamList->hEventStart);
	WaitForSingleObject(m_pkParamList->hEventFinish,5000);
	if(m_pkParamList != NULL)
	{
		delete m_pkParamList;
		m_pkParamList=NULL;
	}
}

LRESULT CProcessKillerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if(message==MYWM_NOTIFYICON && (lParam==WM_RBUTTONDOWN || lParam==WM_LBUTTONDOWN))
	{
		CMenu menu;
	    CMenu* pSubMenu;
	    menu.LoadMenu(IDR_MENU1);
		pSubMenu=menu.GetSubMenu(0); 
		if(m_bRunning)
		{
			pSubMenu->EnableMenuItem(ID_START,MF_GRAYED);
			pSubMenu->EnableMenuItem(ID_STOP,MF_ENABLED);
		}
		else
		{
			pSubMenu->EnableMenuItem(ID_START,MF_ENABLED);
			pSubMenu->EnableMenuItem(ID_STOP,MF_GRAYED);;
		}
		CPoint point;
		GetCursorPos(&point);
		SetForegroundWindow();
		menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTBUTTON,point.x-20,point.y,this,NULL);
	}
	return CDialog::DefWindowProc(message, wParam, lParam);
}

void CProcessKillerDlg::OnQuit() 
{
	CDialog::OnOK();
}

void CProcessKillerDlg::OnAbout() 
{
	CAboutDlg dlg;
	dlg.DoModal();	
}

void CProcessKillerDlg::OnSetting() 
{
	CSetParamDlg dlg;
	dlg.DoModal();
}

DWORD CProcessKillerDlg::GetProcessIdFromName(LPCTSTR name)
{
	PROCESSENTRY32 pe;
	DWORD id = 0;
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	pe.dwSize = sizeof(PROCESSENTRY32);
	if(!Process32First(hSnapshot,&pe))
		return 0;
	do
	{
		pe.dwSize = sizeof(PROCESSENTRY32);
		if(!Process32Next(hSnapshot,&pe))
			break;
		if(strcmp(pe.szExeFile,name) == 0)
		{
			id = pe.th32ProcessID;
			break;
		}
	}while(TRUE);
	CloseHandle(hSnapshot);
	return id;
}

unsigned __stdcall CProcessKillerDlg::ProcessKillerThread(LPVOID lparam)
{
	PKParamList *lpPKParamList = (PKParamList*)lparam;

	static UINT nCount = 0;
	
	while(TRUE)
	{
		if(WaitForSingleObject(lpPKParamList->hEventStart,0) != WAIT_OBJECT_0)
		    break;
		Sleep(1000);
		DWORD id=GetProcessIdFromName(lpPKParamList->szName);
		if(id > 0)
		{
			nCount++;
			if(nCount >= lpPKParamList->nInverval)
			{
				nCount=0;
				HANDLE myhandle = OpenProcess(PROCESS_ALL_ACCESS,TRUE,id);
				DWORD exitcode = 0;
				TerminateProcess(myhandle,exitcode);
				CString str;
				str.Format("%s is Killed",lpPKParamList->szName);
				CLogFile::WriteLogFile(str,"PK.log");
			}			
		}
		else
			nCount=0;
	}
	
	SetEvent(lpPKParamList->hEventFinish);

	return 0;
	
}



void CProcessKillerDlg::OnStart() 
{
	m_bRunning=StartThread();
}

void CProcessKillerDlg::OnStop() 
{
	StopThread();
}

BOOL CProcessKillerDlg::StartThread()
{
	//启动线程
	if(m_pkParamList==NULL)
	{
		m_pkParamList = new PKParamList;
		if (m_pkParamList==NULL)
		{
			return FALSE;
		}
		memset(m_pkParamList,0,sizeof(PKParamList));
		m_pkParamList->hEventStart = CreateEvent(NULL,TRUE,TRUE,NULL);
		m_pkParamList->hEventFinish = CreateEvent(NULL,TRUE,FALSE,NULL);		
	}	
	else
	{
		SetEvent(m_pkParamList->hEventStart);
		ResetEvent(m_pkParamList->hEventFinish);
	}
	
	CString szName=AfxGetApp()->GetProfileString("INI","ProcessName",NULL);
	if(szName.IsEmpty())
	{
		MessageBox("Please give a specified process name(Setting...)","Info",MB_ICONINFORMATION);
		return FALSE;
	}
	else
	{
		strcpy(m_pkParamList->szName,szName.GetBuffer(255));
		szName.ReleaseBuffer();
	}
	UINT nInterval=AfxGetApp()->GetProfileInt("INI","Interval",0);
	if(nInterval == 0)
	{
		MessageBox("Please give an interval between 0~3600(Setting...)","Info",MB_ICONINFORMATION);
		return FALSE;
	}
	else
	{
		m_pkParamList->nInverval= nInterval;
	}
	unsigned dwt;
	m_Thread = (HANDLE)_beginthreadex(NULL,
									  0,
									  ProcessKillerThread,
									  m_pkParamList,
									  0,
									  &dwt);
	if (!m_Thread)
	{
		ModifyNotifyIcon(IDR_MAINFRAME,_T("ProcessKiller  Start Failed"));
		return FALSE;
	}
	else
	{
		CString szTip;
		szTip=_T("ProcessKiller Listening [")+szName+_T("] ...");
		ModifyNotifyIcon(IDR_MAINFRAME,szTip);
	}
	return TRUE;

}

void CProcessKillerDlg::StopThread()
{
	ResetEvent(m_pkParamList->hEventStart);
	WaitForSingleObject(m_pkParamList->hEventFinish,5000);
	m_bRunning = FALSE;
	CString szTip;
	szTip=_T("ProcessKiller Stop Listening");
	ModifyNotifyIcon(IDI_STOP,szTip);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -