VC实例学习:杀死制定进程(以杀死QQ进程为例)
2006-03-29 13:49
417 查看
[align=left]// OicqKiller.cpp : Defines the class behaviors for the application.[/align]
[align=left]//[/align]
[align=left] [/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#include "OicqKiller.h"[/align]
[align=left]#include "OicqKillerDlg.h"[/align]
[align=left] [/align]
[align=left]#include <tlhelp32.h>[/align]
[align=left] [/align]
[align=left]#ifdef _DEBUG[/align]
[align=left]#define new DEBUG_NEW[/align]
[align=left]#undef THIS_FILE[/align]
[align=left]static char THIS_FILE[] = __FILE__;[/align]
[align=left]#endif[/align]
[align=left] [/align]
[align=left]//////////////////////////////////////////////////////////////////////////[/align]
[align=left]// 全局变量[/align]
[align=left]CMutex gMutex;[/align]
[align=left]COicqKillerApp theApp;[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp[/align]
[align=left] [/align]
[align=left]BEGIN_MESSAGE_MAP(COicqKillerApp, CWinApp)[/align]
[align=left] //{{AFX_MSG_MAP(COicqKillerApp)[/align]
[align=left] // NOTE - the ClassWizard will add and remove mapping macros here.[/align]
[align=left] // DO NOT EDIT what you see in these blocks of generated code![/align]
[align=left] //}}AFX_MSG[/align]
[align=left] ON_COMMAND(ID_HELP, CWinApp::OnHelp)[/align]
[align=left]END_MESSAGE_MAP()[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp construction[/align]
[align=left] [/align]
[align=left]COicqKillerApp::COicqKillerApp()[/align]
[align=left]{[/align]
[align=left] // 初始化参数[/align]
[align=left] m_hExitApp = CreateEvent(NULL, TRUE, FALSE, NULL);[/align]
[align=left] m_ThreadKillOicq = NULL;[/align]
[align=left] m_pParm = new PARMSTRUCT;[/align]
[align=left] memset(m_pParm, 0, sizeof(PARMSTRUCT));[/align]
[align=left] m_pParm->bAutoRun = FALSE; // 默认情况:不会开机自动运行[/align]
[align=left] m_pParm->bHiden = FALSE; // 默认情况:运行时会显示界面[/align]
[align=left] m_pParm->bKill = FALSE; // 默认情况:不阻止QQ运行[/align]
[align=left] m_pParm->lKeyValue = KY_DEFAULT; // 默认情况:采用的是默认热键Ctrl + *[/align]
[align=left] m_pParm->lWaitSeconds = WS_DEFAULT; // 默认情况:每5秒检测一次[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp initialization[/align]
[align=left] [/align]
[align=left]BOOL COicqKillerApp::InitInstance()[/align]
[align=left]{[/align]
[align=left] AfxEnableControlContainer();[/align]
[align=left] [/align]
[align=left] // Standard initialization[/align]
[align=left] // If you are not using these features and wish to reduce the size[/align]
[align=left] // of your final executable, you should remove from the following[/align]
[align=left] // the specific initialization routines you do not need.[/align]
[align=left] [/align]
[align=left]#ifdef _AFXDLL[/align]
[align=left] Enable3dControls(); // Call this when using MFC in a shared DLL[/align]
[align=left]#else[/align]
[align=left] Enable3dControlsStatic(); // Call this when linking to MFC statically[/align]
[align=left]#endif[/align]
[align=left] // 一、初始化,启动所有功能[/align]
[align=left] //////////////////////////////////////////////////////////////////////////[/align]
[align=left] HKEY hKey = NULL;[/align]
[align=left] long lErrorCode = -1;[/align]
[align=left] // 0.设置开机自动运行[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//Microsoft//Windows//CurrentVersion//Run", NULL, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {[/align]
[align=left] char szPath[MAX_PATH] = {0};[/align]
[align=left] GetModuleFileName(NULL, szPath, MAX_PATH);[/align]
[align=left] CString scValue;[/align]
[align=left] scValue.Format("%s", szPath);[/align]
[align=left] RegSetValueEx(hKey, "OicqKiller.exe", 0, REG_SZ, (BYTE*)szPath, scValue.GetLength() + 1);[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] AfxMessageBox("设置开机自动运行出错");[/align]
[align=left] }[/align]
[align=left] // 1.从注册表读取参数[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "bAutoRun", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->bAutoRun = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bAutoRun = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.2 读取Hiden[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
lErrorCode
cebd
= RegQueryValueEx(hKey, "bHiden", 0, &dwType, szValue, &dwBytes);
[align=left] m_pParm->bHiden = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bHiden = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.3 读取Kill[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "bKill", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->bKill = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bKill = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.4 读取KeyValue[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "lKeyValue", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->lKeyValue = MAKELONG(MAKEWORD(szValue[0], szValue[1]), MAKEWORD(szValue[2], szValue[3]));[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->lKeyValue = KY_DEFAULT; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.5 读取WaitSeconds[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "lWaitSeconds", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->lWaitSeconds = MAKELONG(MAKEWORD(szValue[0], szValue[1]), MAKEWORD(szValue[2], szValue[3]));[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->lWaitSeconds = WS_DEFAULT; // 默认情况[/align]
[align=left] }[/align]
[align=left] //////////////////////////////////////////////////////////////////////////[/align]
[align=left] // 2.开启封杀线程[/align]
[align=left] if (m_ThreadKillOicq == NULL)[/align]
[align=left] {[/align]
[align=left] m_ThreadKillOicq = AfxBeginThread(KillQicqProc, m_pParm);[/align]
[align=left] if (m_ThreadKillOicq == NULL)[/align]
[align=left] {// 2.1 开启线程失败[/align]
[align=left] AfxMessageBox("开启QQ封杀线程失败,请重启软件");[/align]
[align=left] return FALSE;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {// 2.2 开启线程成功[/align]
[align=left] m_ThreadKillOicq->m_bAutoDelete = FALSE;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] // 3.显示方式[/align]
[align=left] COicqKillerDlg dlg;[/align]
[align=left] dlg.Create(IDD_OICQKILLER_DIALOG, theApp.m_pMainWnd);[/align]
[align=left] if (m_pParm->bHiden)[/align]
[align=left] {// 隐藏[/align]
[align=left] dlg.ShowWindow(SW_HIDE);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {// 显示[/align]
[align=left] dlg.ShowWindow(SW_SHOW);[/align]
[align=left] }[/align]
[align=left] dlg.RunModalLoop();[/align]
[align=left] return FALSE;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 二、封杀线程体[/align]
[align=left]UINT COicqKillerApp::KillQicqProc(LPVOID lpParm)[/align]
[align=left]{[/align]
[align=left] PPARMSTRUCTpParm = (PPARMSTRUCT)lpParm;[/align]
[align=left] HANDLE hSnapShot = NULL;[/align]
[align=left] while (1)[/align]
[align=left] {[/align]
[align=left] // 0.获取最新运行参数[/align]
[align=left] gMutex.Lock();[/align]
[align=left] LONG lWaitSeconds = pParm->lWaitSeconds;[/align]
[align=left] BOOL bKill = pParm->bKill;[/align]
[align=left] gMutex.Unlock();[/align]
[align=left] if (WaitForSingleObject(theApp.m_hExitApp, lWaitSeconds) == WAIT_OBJECT_0)[/align]
[align=left] {// 1.退出信号激活,退出线程[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] if (!bKill)[/align]
[align=left] {// 不阻止QQ运行[/align]
[align=left] continue;[/align]
[align=left] }[/align]
[align=left] // 2.检查系统中是否有QQ进程[/align]
[align=left] hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);[/align]
[align=left] if (hSnapShot == NULL)[/align]
[align=left] {[/align]
[align=left] continue;[/align]
[align=left] }[/align]
[align=left] long nProcess= 0;[/align]
[align=left] PROCESSENTRY32 prosInfo;[/align]
[align=left] prosInfo.dwSize = sizeof(prosInfo);[/align]
[align=left] BOOL bStatus = Process32First(hSnapShot, &prosInfo);[/align]
[align=left] while (bStatus)[/align]
[align=left] {[/align]
[align=left] CString scTmp = prosInfo.szExeFile;[/align]
[align=left] scTmp.MakeUpper();[/align]
[align=left] if ( scTmp == "QQ.EXE")[/align]
[align=left] {// 3.1 找到QQ进程[/align]
[align=left] // 3.1.1 中止QQ进程[/align]
[align=left] DWORD dwProcessID = prosInfo.th32ProcessID;[/align]
[align=left] HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);[/align]
[align=left] ::TerminateProcess(hProcess, 0);[/align]
[align=left] CloseHandle(hProcess);[/align]
[align=left] }[/align]
[align=left] bStatus = Process32Next(hSnapShot, &prosInfo);[/align]
[align=left] ++nProcess;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return 1;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 三、退出程序:释放资源[/align]
[align=left]int COicqKillerApp::ExitInstance() [/align]
[align=left]{[/align]
[align=left] // 1.发出退出信号[/align]
[align=left] if (m_ThreadKillOicq != NULL)[/align]
[align=left] {[/align]
[align=left] SetEvent(m_hExitApp);[/align]
[align=left] }[/align]
[align=left] // 2.关闭句柄[/align]
[align=left] m_ThreadKillOicq = NULL;[/align]
[align=left] CloseHandle(m_hExitApp);[/align]
[align=left] // 3.清空缓存[/align]
[align=left] delete m_pParm;[/align]
[align=left] m_pParm = NULL;[/align]
[align=left] return CWinApp::ExitInstance();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]//[/align]
[align=left] [/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#include "OicqKiller.h"[/align]
[align=left]#include "OicqKillerDlg.h"[/align]
[align=left] [/align]
[align=left]#include <tlhelp32.h>[/align]
[align=left] [/align]
[align=left]#ifdef _DEBUG[/align]
[align=left]#define new DEBUG_NEW[/align]
[align=left]#undef THIS_FILE[/align]
[align=left]static char THIS_FILE[] = __FILE__;[/align]
[align=left]#endif[/align]
[align=left] [/align]
[align=left]//////////////////////////////////////////////////////////////////////////[/align]
[align=left]// 全局变量[/align]
[align=left]CMutex gMutex;[/align]
[align=left]COicqKillerApp theApp;[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp[/align]
[align=left] [/align]
[align=left]BEGIN_MESSAGE_MAP(COicqKillerApp, CWinApp)[/align]
[align=left] //{{AFX_MSG_MAP(COicqKillerApp)[/align]
[align=left] // NOTE - the ClassWizard will add and remove mapping macros here.[/align]
[align=left] // DO NOT EDIT what you see in these blocks of generated code![/align]
[align=left] //}}AFX_MSG[/align]
[align=left] ON_COMMAND(ID_HELP, CWinApp::OnHelp)[/align]
[align=left]END_MESSAGE_MAP()[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp construction[/align]
[align=left] [/align]
[align=left]COicqKillerApp::COicqKillerApp()[/align]
[align=left]{[/align]
[align=left] // 初始化参数[/align]
[align=left] m_hExitApp = CreateEvent(NULL, TRUE, FALSE, NULL);[/align]
[align=left] m_ThreadKillOicq = NULL;[/align]
[align=left] m_pParm = new PARMSTRUCT;[/align]
[align=left] memset(m_pParm, 0, sizeof(PARMSTRUCT));[/align]
[align=left] m_pParm->bAutoRun = FALSE; // 默认情况:不会开机自动运行[/align]
[align=left] m_pParm->bHiden = FALSE; // 默认情况:运行时会显示界面[/align]
[align=left] m_pParm->bKill = FALSE; // 默认情况:不阻止QQ运行[/align]
[align=left] m_pParm->lKeyValue = KY_DEFAULT; // 默认情况:采用的是默认热键Ctrl + *[/align]
[align=left] m_pParm->lWaitSeconds = WS_DEFAULT; // 默认情况:每5秒检测一次[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/////////////////////////////////////////////////////////////////////////////[/align]
[align=left]// COicqKillerApp initialization[/align]
[align=left] [/align]
[align=left]BOOL COicqKillerApp::InitInstance()[/align]
[align=left]{[/align]
[align=left] AfxEnableControlContainer();[/align]
[align=left] [/align]
[align=left] // Standard initialization[/align]
[align=left] // If you are not using these features and wish to reduce the size[/align]
[align=left] // of your final executable, you should remove from the following[/align]
[align=left] // the specific initialization routines you do not need.[/align]
[align=left] [/align]
[align=left]#ifdef _AFXDLL[/align]
[align=left] Enable3dControls(); // Call this when using MFC in a shared DLL[/align]
[align=left]#else[/align]
[align=left] Enable3dControlsStatic(); // Call this when linking to MFC statically[/align]
[align=left]#endif[/align]
[align=left] // 一、初始化,启动所有功能[/align]
[align=left] //////////////////////////////////////////////////////////////////////////[/align]
[align=left] HKEY hKey = NULL;[/align]
[align=left] long lErrorCode = -1;[/align]
[align=left] // 0.设置开机自动运行[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//Microsoft//Windows//CurrentVersion//Run", NULL, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {[/align]
[align=left] char szPath[MAX_PATH] = {0};[/align]
[align=left] GetModuleFileName(NULL, szPath, MAX_PATH);[/align]
[align=left] CString scValue;[/align]
[align=left] scValue.Format("%s", szPath);[/align]
[align=left] RegSetValueEx(hKey, "OicqKiller.exe", 0, REG_SZ, (BYTE*)szPath, scValue.GetLength() + 1);[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] AfxMessageBox("设置开机自动运行出错");[/align]
[align=left] }[/align]
[align=left] // 1.从注册表读取参数[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "bAutoRun", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->bAutoRun = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bAutoRun = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.2 读取Hiden[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
lErrorCode
cebd
= RegQueryValueEx(hKey, "bHiden", 0, &dwType, szValue, &dwBytes);
[align=left] m_pParm->bHiden = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bHiden = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.3 读取Kill[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "bKill", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->bKill = szValue[0] + szValue[1] * 0x100;[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->bKill = TRUE; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.4 读取KeyValue[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "lKeyValue", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->lKeyValue = MAKELONG(MAKEWORD(szValue[0], szValue[1]), MAKEWORD(szValue[2], szValue[3]));[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->lKeyValue = KY_DEFAULT; // 默认情况[/align]
[align=left] }[/align]
[align=left] // 1.5 读取WaitSeconds[/align]
[align=left] hKey = NULL;[/align]
[align=left] if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SoftWare//OicqKiller", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)[/align]
[align=left] {// 成功[/align]
[align=left] DWORD dwType;[/align]
[align=left] DWORD dwBytes = 64;[/align]
[align=left] BYTE szValue[4] = {0};[/align]
[align=left] lErrorCode = RegQueryValueEx(hKey, "lWaitSeconds", 0, &dwType, szValue, &dwBytes);[/align]
[align=left] m_pParm->lWaitSeconds = MAKELONG(MAKEWORD(szValue[0], szValue[1]), MAKEWORD(szValue[2], szValue[3]));[/align]
[align=left] RegCloseKey(hKey);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] m_pParm->lWaitSeconds = WS_DEFAULT; // 默认情况[/align]
[align=left] }[/align]
[align=left] //////////////////////////////////////////////////////////////////////////[/align]
[align=left] // 2.开启封杀线程[/align]
[align=left] if (m_ThreadKillOicq == NULL)[/align]
[align=left] {[/align]
[align=left] m_ThreadKillOicq = AfxBeginThread(KillQicqProc, m_pParm);[/align]
[align=left] if (m_ThreadKillOicq == NULL)[/align]
[align=left] {// 2.1 开启线程失败[/align]
[align=left] AfxMessageBox("开启QQ封杀线程失败,请重启软件");[/align]
[align=left] return FALSE;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {// 2.2 开启线程成功[/align]
[align=left] m_ThreadKillOicq->m_bAutoDelete = FALSE;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] // 3.显示方式[/align]
[align=left] COicqKillerDlg dlg;[/align]
[align=left] dlg.Create(IDD_OICQKILLER_DIALOG, theApp.m_pMainWnd);[/align]
[align=left] if (m_pParm->bHiden)[/align]
[align=left] {// 隐藏[/align]
[align=left] dlg.ShowWindow(SW_HIDE);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {// 显示[/align]
[align=left] dlg.ShowWindow(SW_SHOW);[/align]
[align=left] }[/align]
[align=left] dlg.RunModalLoop();[/align]
[align=left] return FALSE;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 二、封杀线程体[/align]
[align=left]UINT COicqKillerApp::KillQicqProc(LPVOID lpParm)[/align]
[align=left]{[/align]
[align=left] PPARMSTRUCTpParm = (PPARMSTRUCT)lpParm;[/align]
[align=left] HANDLE hSnapShot = NULL;[/align]
[align=left] while (1)[/align]
[align=left] {[/align]
[align=left] // 0.获取最新运行参数[/align]
[align=left] gMutex.Lock();[/align]
[align=left] LONG lWaitSeconds = pParm->lWaitSeconds;[/align]
[align=left] BOOL bKill = pParm->bKill;[/align]
[align=left] gMutex.Unlock();[/align]
[align=left] if (WaitForSingleObject(theApp.m_hExitApp, lWaitSeconds) == WAIT_OBJECT_0)[/align]
[align=left] {// 1.退出信号激活,退出线程[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] if (!bKill)[/align]
[align=left] {// 不阻止QQ运行[/align]
[align=left] continue;[/align]
[align=left] }[/align]
[align=left] // 2.检查系统中是否有QQ进程[/align]
[align=left] hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);[/align]
[align=left] if (hSnapShot == NULL)[/align]
[align=left] {[/align]
[align=left] continue;[/align]
[align=left] }[/align]
[align=left] long nProcess= 0;[/align]
[align=left] PROCESSENTRY32 prosInfo;[/align]
[align=left] prosInfo.dwSize = sizeof(prosInfo);[/align]
[align=left] BOOL bStatus = Process32First(hSnapShot, &prosInfo);[/align]
[align=left] while (bStatus)[/align]
[align=left] {[/align]
[align=left] CString scTmp = prosInfo.szExeFile;[/align]
[align=left] scTmp.MakeUpper();[/align]
[align=left] if ( scTmp == "QQ.EXE")[/align]
[align=left] {// 3.1 找到QQ进程[/align]
[align=left] // 3.1.1 中止QQ进程[/align]
[align=left] DWORD dwProcessID = prosInfo.th32ProcessID;[/align]
[align=left] HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);[/align]
[align=left] ::TerminateProcess(hProcess, 0);[/align]
[align=left] CloseHandle(hProcess);[/align]
[align=left] }[/align]
[align=left] bStatus = Process32Next(hSnapShot, &prosInfo);[/align]
[align=left] ++nProcess;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return 1;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 三、退出程序:释放资源[/align]
[align=left]int COicqKillerApp::ExitInstance() [/align]
[align=left]{[/align]
[align=left] // 1.发出退出信号[/align]
[align=left] if (m_ThreadKillOicq != NULL)[/align]
[align=left] {[/align]
[align=left] SetEvent(m_hExitApp);[/align]
[align=left] }[/align]
[align=left] // 2.关闭句柄[/align]
[align=left] m_ThreadKillOicq = NULL;[/align]
[align=left] CloseHandle(m_hExitApp);[/align]
[align=left] // 3.清空缓存[/align]
[align=left] delete m_pParm;[/align]
[align=left] m_pParm = NULL;[/align]
[align=left] return CWinApp::ExitInstance();[/align]
[align=left]}[/align]
[align=left] [/align]
相关文章推荐
- UNIX环境高级编程学习之第十三章守护进程 - 单实例的守护进程
- windows核心编程学习体会1:获取进程实例句柄
- VC进程相关的学习(二)(钩子基础)
- VC进程相关的学习(三)(模拟键盘鼠标)
- 孙鑫VC学习笔记:第十五讲 进程和线程基本概念
- [转]杀死已知应用程序名称的进程 VC
- VC实例学习 (1):总结下今天学习的东西
- 进程只被实例化一次(VC)
- 利用application,cookies,sessino以及文件文件操作制作计数器和投票的综合实例(按学习进程更新)
- VC++ .Net 实例学习
- VC使用TerminateProcess结束进程实例
- VC++杀死进程
- VC++学习之进程和线程的区别
- oom和oom-killer实例简介(内存用完和进程杀死)------顺便说说linux下的两个重要目录:/proc/kmsg和/var/log/messages
- VC进程相关的学习(五)(API截获完美版)
- 孙鑫VC学习笔记:第十七讲 用剪贴板实现进程间的通信
- VC实例学习(5) : 这几天都忙着找工作,终于到了星期一
- VC实例学习(4):BT拓展开发文档
- OpenGL学习进程(9)在3D空间的绘制实例
- VC(win32)通过进程名杀死进程