// AppKeeper.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
@描述:简单的Windows守护进程的例子(C++版本)
*/
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <io.h>
#include <iostream>
#include <Tlhelp32.h>
using namespace std;
//隐藏DOS黑窗口
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
//定义路径最大程度
#define MAX_PATH 4096
//定义守护进程名称
#define PROCCESS_NAME L"abcd.exe"
//定义写入的注册表路径
#define SELFSTART_REGEDIT_PATH "D:\\test\\guard\\"
//设置本身开机自启动
BOOL SetSelfStart()
{
//获取程序完整名称
char pName[MAX_PATH] = { 0 };
GetModuleFileNameA(NULL, pName, MAX_PATH);
//在注册表中写入启动信息
HKEY hKey = NULL;
LONG lRet = NULL;
lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SELFSTART_REGEDIT_PATH, 0, KEY_ALL_ACCESS, &hKey);
//判断是否成功
if (lRet != ERROR_SUCCESS)
{
return FALSE;
}
lRet = RegSetValueExA(hKey, "w10_daemon", 0, REG_SZ, (const unsigned char*)pName, strlen(pName) + sizeof(char));
//判断是否成功
if (lRet != ERROR_SUCCESS)
{
return FALSE;
}
//关闭注册表
RegCloseKey(hKey);
return TRUE;
}
BOOL IsExistProcess(CONST WCHAR* szProcessName, DWORD& ProcessID)
{
PROCESSENTRY32 processEntry32;
HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)toolHelp32Snapshot) != -1)
{
processEntry32.dwSize = sizeof(processEntry32);
if (Process32First(toolHelp32Snapshot, &processEntry32))
{
do
{
if (wcscmp(szProcessName, processEntry32.szExeFile) == 0)
{
ProcessID = processEntry32.th32ProcessID;
return TRUE;
}
} while (Process32Next(toolHelp32Snapshot, &processEntry32));
}
CloseHandle(toolHelp32Snapshot);
}
return FALSE;
}
BOOL InitInstance()
{
LPCWSTR pszExeName = L"GaurdSaver";
// 用应用程序名创建信号量
HANDLE hSem = CreateSemaphore(NULL, 1, 1, pszExeName);
// 信号量已存在?
// 信号量存在,则程序已有一个实例运行
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// 关闭信号量句柄
CloseHandle(hSem);
return FALSE;
#if 0
// 寻找先前实例的主窗口
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while (::IsWindow(hWndPrevious))
{
// 检查窗口是否有预设的标记?
// 有,则是我们寻找的主窗
if (::GetProp(hWndPrevious, pszExeName))
{
// 主窗口已最小化,则恢复其大小
if (::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious, SW_RESTORE);
// 将主窗激活
::SetForegroundWindow(hWndPrevious);
// 将主窗的对话框激活
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
// 退出本实例
return FALSE;
}
// 继续寻找下一个窗口
hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
}
// 前一实例已存在,但找不到其主窗
// 可能出错了
// 退出本实例
return FALSE;
#endif
}
return TRUE;
}
// 关闭进程
void CloseProcess(CONST WCHAR* szProcessName)
{
DWORD th32ProcessID = 0;
if (!IsExistProcess(szProcessName, th32ProcessID))
return;
//利用查找到的进程ID,打开进程:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, th32ProcessID);
//关闭进程
BOOL bRet = TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
int main()
{
#if 0
//设置程序开机自启动
if (!SetSelfStart())
{
cout << "守护进程开机自启动失败" << endl;
return -1;
}
#endif
if (!InitInstance())
return 0;
//获取当前程序的路径
WCHAR pPath[MAX_PATH] = { 0 };
GetCurrentDirectoryW(MAX_PATH, pPath);
//拼接需要守护的程序
wcscat_s(pPath, L"\\");
wcscat_s(pPath, PROCCESS_NAME);
//构造cmd执行守护进程的字符串
WCHAR pCmd[MAX_PATH] = { 0 };
wcscat_s(pCmd, L"cmd /c ");
wcscat_s(pCmd, pPath);
//无限循环,监视守护进程
do {
//检查守护程序是否存在
bool bExist = false;
PROCESSENTRY32 processEntry32;
HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)toolHelp32Snapshot) != -1)
{
processEntry32.dwSize = sizeof(processEntry32);
if (Process32First(toolHelp32Snapshot, &processEntry32))
{
do
{
if (wcscmp(PROCCESS_NAME, processEntry32.szExeFile) == 0)
{
bExist = true;
break;
}
} while (Process32Next(toolHelp32Snapshot, &processEntry32));
}
CloseHandle(toolHelp32Snapshot);
}
// 进程不存在则启动该进程
if (!bExist)
{
STARTUPINFOW si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
//进程对象
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
//创建子进程,判断是否执行成功
if (!CreateProcessW(NULL, pCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
cout << "守护进程启动失败,程序即将退出" << endl;
return 0;
}
// 等待进程启动
WaitForInputIdle(pi.hProcess, 10000);
// 获取进程窗口句柄
HWND hWnd = FindWindow(NULL, PROCCESS_NAME);
if (hWnd)
{
// 将进程窗口置顶
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
// 给予焦点
SetForegroundWindow(hWnd);
}
//启动成功,获取进程的ID
cout << "守护进程成功,ID:" << pi.dwProcessId << endl;
//无限等待子进程退出
WaitForSingleObject(pi.hProcess, INFINITE);
//如果退出了
cout << "守护进程退出了。。。" << endl;
//关闭进程和句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
// 进程存在,则等待该进程的退出
else
{
cout << "程序存在" << endl;
HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, processEntry32.th32ProcessID);
if (hProcess != NULL) {
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
}
}
//睡一下,重启
Sleep(2000);
} while (true);
return 0;
}

北极熊的奋斗史
- 粉丝: 148
最新资源
- VBQQ消息发送器源码.doc
- 互联网+背景下的高职服装设计创新创业能力培养.docx
- 2023年开放大学CAD绘图实训形考作业.doc
- 基于互联网+时代的员工招聘管理路径研究.docx
- VBM使用手册.docx
- 大数据与机械 PPT.ppt
- 南开大学2021年9月《Python编程基础》作业考核试题及答案参考1.docx
- 互联网时代企业财务管理创新探讨.docx
- 『电子商务学习经验』医疗网站年终推广心得备考资料.doc
- 互联网信息公告服务协议书.docx
- (完整word版)数据结构C语言版——图的建立与遍历(word文档良心出品).doc
- 00908自考网络营销与策划试卷(答案全面).pdf
- 2023年操作系统试题库经典版(1).doc
- 18 项目管理输入输入关系图.pptx
- 2022自动化专业自荐信_.docx
- 2022年通信专业学生实习报告.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


