程序定时关闭器 - Windows下多功能自动定时关闭程序的软件工具

32 篇文章 2 订阅
31 篇文章 0 订阅

有时您可能在程序处理复杂文档、渲染图形、下载大文件或系统升级时,无法避免地要让电脑开上几个小时。在这种情况下,一旦您的任务完成,自动结束所有活动并关闭系统的应用程序可能会非常有帮助。

程序定时关闭器是一款小巧实用的Windows自动化工具软件,它使您能够设置定时关闭系统上正在运行的程序和软件,并选择是否要关闭、注销、休眠或重新启动您的电脑。 程序定时关闭器可以一次支持多个自动关闭任务,而且还能在设定时间自动运行指定程序,也可以在检测到没有鼠标移动或键盘操作之后来执行任务。即使您要离开电脑,程序定时关闭器可以帮您完成很多定时的工作。

软件特点

有中文界面

在指定时间点后关闭程序

定时让指定程序在一段时间后关闭

关闭隐藏进程

定时自动关机/休眠/重启/注销

多个任务/批量关闭

自动关闭显示器

保存并加载任务列表

定时运行指定程序

无鼠标/键盘操作后运行或关闭程序

自定义循环关闭或运行程序

一次性关闭多个程序

一段时间没有鼠标和按键操作后关闭程序

 

程序定时关闭器旨在自动关闭所有程序并在指定时间后关闭或注销系统。这样,如果您下载了大量文件或正在转换视频或文档,您可以使用程序定时关闭器提前设置时间来定时关闭程序和计算机。您可以外出或休息一下,并确保在指定时间后所有正在运行的程序都将安全结束。

除了关闭程序并自动关闭计算机之外,程序定时关闭器还为您提供了许多其他选项。您还可以指示是否要在一段时间后让系统进入睡眠或休眠状态。这可以让您唤醒系统后从中断的地方继续工作。 程序定时关闭器还使您能够设置何时重新启动计算机。一旦指定的时间到了,程序定时关闭器就会按照您的指示进行操作。此外,如果您不想关机或者待机,可以使用此软件只关闭显示器显示。这可以让您的应用程序在后台运行,同时保持系统安全。

程序定时关闭器还可以一次性结束多个程序。您只需选择要关闭的多个程序并在您指定的时间自动结束即可。

官网:

https://autoclose.neticon-default.png?t=M666https://autoclose.net

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的C++代码示例,用于实现Windows后台服务,定时监控多个进程,并使用CreateProcessAsUser函数重启并打开进程界面: ```c++ #include <windows.h> #include <tchar.h> #include <stdio.h> #define SERVICE_NAME _T("MyService") SERVICE_STATUS g_ServiceStatus = { 0 }; SERVICE_STATUS_HANDLE g_StatusHandle = NULL; HANDLE g_ServiceStopEvent = INVALID_HANDLE_VALUE; VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv); VOID WINAPI ServiceCtrlHandler(DWORD); DWORD WINAPI ServiceWorkerThread(LPVOID lpParam); int _tmain(int argc, TCHAR* argv[]) { SERVICE_TABLE_ENTRY ServiceTable[] = { { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) { return GetLastError(); } return 0; } VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv) { DWORD Status = E_FAIL; g_StatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler); if (g_StatusHandle == NULL) { return; } ZeroMemory(&g_ServiceStatus, sizeof(g_ServiceStatus)); g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_ServiceStatus.dwControlsAccepted = 0; g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; g_ServiceStatus.dwWin32ExitCode = 0; g_ServiceStatus.dwServiceSpecificExitCode = 0; g_ServiceStatus.dwCheckPoint = 0; if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE) { return; } g_ServiceStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (g_ServiceStopEvent == NULL) { g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; g_ServiceStatus.dwWin32ExitCode = GetLastError(); SetServiceStatus(g_StatusHandle, &g_ServiceStatus); return; } g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); HANDLE hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(g_ServiceStopEvent); g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); return; } VOID WINAPI ServiceCtrlHandler(DWORD CtrlCode) { switch (CtrlCode) { case SERVICE_CONTROL_STOP: if (g_ServiceStatus.dwCurrentState != SERVICE_RUNNING) break; g_ServiceStatus.dwControlsAccepted = 0; g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; g_ServiceStatus.dwWin32ExitCode = 0; g_ServiceStatus.dwCheckPoint = 4; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); SetEvent(g_ServiceStopEvent); break; } } DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) { DWORD dwWaitTime = 60000; // 1 minute DWORD dwProcessID = 0; HANDLE hProcess = NULL; HANDLE hToken = NULL; HANDLE hDupToken = NULL; STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; TCHAR szCommandLine[MAX_PATH] = { 0 }; while (WaitForSingleObject(g_ServiceStopEvent, dwWaitTime) != WAIT_OBJECT_0) { // Monitor multiple processes if (GetProcessIdByName(_T("process1.exe"), &dwProcessID)) { // Process found, do nothing } else { // Process not found, restart it if (LogonUser(_T("username"), _T("domain"), _T("password"), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) { if (DuplicateTokenEx(hToken, TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID, NULL, SecurityImpersonation, TokenPrimary, &hDupToken)) { si.lpDesktop = _T("winsta0\\default"); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; _stprintf_s(szCommandLine, _T("\"C:\\Program Files\\process1.exe\"")); if (CreateProcessAsUser(hDupToken, NULL, szCommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { // Error creating process } CloseHandle(hDupToken); } else { // Error duplicating token } CloseHandle(hToken); } else { // Error logging on user } } } return ERROR_SUCCESS; } BOOL GetProcessIdByName(LPCTSTR lpName, DWORD* pProcessID) { PROCESSENTRY32 pe32; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return FALSE; } pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hSnapshot, &pe32)) { CloseHandle(hSnapshot); return FALSE; } do { if (!_tcsicmp(pe32.szExeFile, lpName)) { *pProcessID = pe32.th32ProcessID; CloseHandle(hSnapshot); return TRUE; } } while (Process32Next(hSnapshot, &pe32)); CloseHandle(hSnapshot); return FALSE; } ``` 该代码中的ServiceWorkerThread函数用于定时监控多个进程。如果某个进程未能找到,则使用CreateProcessAsUser函数创建一个新的进程,并打开其界面。GetProcessIdByName函数用于根据进程名称获取其进程ID。该代码仅供参考,需要根据具体需求进行修改。 ### 回答2: 要实现Windows后台服务,定时监控多个进程,并使用CreateProcessAsUser函数来重启和打开界面,可以使用以下步骤: 1. 创建一个Windows服务程序的框架,包括服务的启动、停止和运行的功能。 2. 在服务的运行函数中,使用定时定时监控多个进程的状态。可以使用EnumProcesses函数获取当前运行的进程列表,然后遍历列表,使用OpenProcess函数打开每个进程,并使用GetExitCodeProcess函数获取进程的退出码,来判断进程是否正在运行。 3. 如果发现某个进程已经退出,则调用CreateProcessAsUser函数来重启该进程并打开界面。在调用CreateProcessAsUser函数时,需要提供要启动的应用程序的路径、命令行参数等信息。 4. 使用CloseHandle函数关闭每个打开的进程句柄,确保资源的释放。 5. 在服务被停止时,释放所有已经打开的句柄并清理资源。 以上步骤的实现可以参考Windows服务编程的相关文档和示例代码,同时需注意服务程序的安全性和权限管理,特别是在使用CreateProcessAsUser函数时,请确保用户有足够的权限来启动对应的进程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值