// 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;
}
没有合适的资源?快使用搜索试试~ 我知道了~
MFC实现守护进程,包括开机自启动、进程单例、进程查询、进程等待、重启进程、关闭进程
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共1个文件
cpp:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 5 0 下载量 38 浏览量
2024-05-30
17:35:03
上传
评论
收藏 3KB RAR 举报
温馨提示
想知道详细内容的可以去这篇文章: https://blog.csdn.net/chenxipu123/article/details/139329085?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139329085%22%2C%22source%22%3A%22chenxipu123%22%7D
资源推荐
资源详情
资源评论
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![exe](https://img-home.csdnimg.cn/images/20210720083343.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 1 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/82da6f4d37854a7b8255fee4b477530d_chenxipu123.jpg!1)
北极熊的奋斗史
- 粉丝: 136
- 资源: 14
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)