在windows环境使用C++开发一个提示保护眼睛的服务(开发中)

长时间使用电脑,导致眼睛胀痛,去医院检查,眼压升高,严重可能导致青光眼,进而导致失明。

所以准备开发一个程序来提醒自己保护眼睛。

程序在后台运行,所以准备开发为服务,开机自启动。

我对C++更熟,对C#不熟,所以准备使用C++。

服务检测开机与解锁,检测到之后开始计时,比如40分钟,这个可以自己定,之后提示已用时40分钟,需要休息眼睛。

windows服务开发文档

Services (Services) - Win32 apps | Microsoft Learn

使用chat3.5翻译的

AIchatOS

服务

一个服务应用程序符合服务控制管理器(SCM)的接口规则。它可以在系统启动时自动启动,通过服务控制面板小程序由用户启动,或者由使用服务函数的应用程序启动。即使没有用户登录到系统,服务也可以执行。

驱动程序服务符合设备驱动程序协议。它类似于服务应用程序,但不与SCM交互。为简单起见,在这个概述中,术语"服务"指的是服务应用程序。

触发器现在可以用来控制服务启动。有关更多信息,请参阅服务配置。

关于服务

服务控制管理器(SCM)维护一个安装的服务和驱动程序服务的数据库,并提供了一种统一且安全的方法来控制它们。数据库包含每个服务或驱动程序服务应如何启动的信息。它还使系统管理员能够自定义每个服务的安全要求,从而控制对该服务的访问。

下面是使用SCM提供的功能的程序类型:

类型            描述

服务程序:提供一个或多个服务所需的可执行代码的程序。服务程序使用与SCM连接并向SCM发送状态信息的函数。

服务配置程序:查询或修改服务数据库的程序。服务配置程序使用打开数据库的函数,在数据库中安装或删除服务,并查询或修改已安装服务的配置和安全参数。服务配置程序管理服务和驱动程序服务。

服务控制程序:启动和控制服务和驱动程序服务的程序。服务控制程序使用向SCM发送请求的函数,而SCM执行这些请求。

服务控制管理器

.服务控制管理器

服务控制管理器(SCM)在系统启动时启动。它是一个远程过程调用(RPC)服务器,因此服务配置和服务控制程序可以操作远程机器上的服务。

服务函数提供了SCM执行以下任务的接口:

维护安装的服务数据库。 在系统启动或需求时启动服务和驱动程序服务。 枚举安装的服务和驱动程序服务。 维护正在运行的服务和驱动程序服务的状态信息。 向正在运行的服务发送控制请求。 锁定和解锁服务数据库。

.已安装服务的数据库

SCM在注册表中维护着一个已安装服务的数据库。该数据库由SCM和添加、修改或配置服务的程序使用。以下是该数据库的注册表键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services。

该键包含每个已安装服务和驱动程序服务的子键。子键的名称是服务的名称,由服务配置程序在安装服务时通过CreateService函数指定。

在系统安装时创建了数据库的初始副本。数据库包含系统启动期间所需的设备驱动程序的条目。数据库包括每个已安装服务和驱动程序服务的以下信息:

服务类型。这指示服务是在自己的进程中执行还是与其他服务共享进程。对于驱动程序服务,这指示服务是内核驱动程序还是文件系统驱动程序。 启动类型。这指示服务或驱动程序服务是否在系统启动时自动启动(自动启动服务),或者在服务控制程序请求时由SCM启动它(按需启动服务)。启动类型还可以指示服务或驱动程序服务被禁用,此时无法启动它。 错误控制级别。如果服务或驱动程序服务在系统启动期间无法启动,这指定错误的严重性,并确定启动程序将采取的操作。 可执行文件的完整路径。服务的文件扩展名为.EXE,驱动程序服务的文件扩展名为.SYS。 用于确定启动服务或驱动程序服务的正确顺序的可选依赖信息。对于服务,此信息可以包括SCM必须在启动指定服务之前启动的服务列表、服务所属的加载顺序组的名称,以及指示服务在其加载顺序组中的启动顺序的标识符。对于驱动程序服务,此信息包括必须在指定驱动程序之前启动的驱动程序的列表。 对于服务,还有一个可选的账户名和密码。服务程序在该账户的上下文中运行。如果未指定账户,则服务在LocalSystem账户的上下文中执行。 对于驱动程序服务,还有一个可选的驱动程序对象名称(例如,\FileSystem\Rdr或\Driver\Xns),由I/O系统用于加载设备驱动程序。如果未指定名称,则I/O系统将根据驱动程序服务名称创建一个默认名称。

.自动启动服务

在系统启动过程中,SCM会启动所有自动启动的服务以及它们所依赖的服务。例如,如果一个自动启动的服务依赖于一个按需启动的服务,那么按需启动的服务也会被自动启动。

加载顺序由以下因素决定:

加载顺序组列表中组的顺序。这些信息存储在以下注册表键中的ServiceGroupOrder值中:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

要为一个服务指定加载顺序组,可以使用CreateService或ChangeServiceConfig函数的lpLoadOrderGroup参数。

标签顺序向量中每个组内服务的顺序。这些信息存储在以下注册表键中的GroupOrderList值中:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

每个服务所列出的依赖关系。

在引导完成后,系统执行由以下注册表键的BootVerificationProgram值指定的引导验证程序:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

默认情况下,此值没有设置。在第一个用户登录后,系统只是报告引导成功。您可以提供一个引导验证程序,使用NotifyBootConfigStatus函数检查系统是否存在问题,并向SCM报告引导状态。

成功启动后,系统会将数据库的副本保存在最后已知的良好(LKG)配置中。如果对活动数据库进行的更改导致系统重新启动失败,系统可以恢复此数据库副本。以下是此数据库的注册表键:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services

其中XXX是保存在以下注册表值中的值:HKEY_LOCAL_MACHINE\System\Select\LastKnownGood。

如果一个具有SERVICE_ERROR_CRITICAL错误控制级别的自动启动服务启动失败,SCM会使用LKG配置重新启动计算机。如果已经使用LKG配置,则引导失败。

可以通过调用ChangeServiceConfig2函数并使用SERVICE_CONFIG_DELAYED_AUTO_START_INFO将自动启动服务配置为延迟自动启动服务。此更改将在下次系统启动后生效。有关更多信息,请参阅SERVICE_DELAYED_AUTO_START_INFO。

.按需启动服务

用户可以使用服务控制面板实用程序启动服务。用户可以在“启动参数”字段中指定服务的参数。服务控制程序可以使用StartService函数启动服务并指定其参数。

当服务启动时,SCM执行以下步骤:

检索存储在数据库中的帐户信息。 登录服务帐户。 加载用户配置文件。 创建挂起状态的服务。 将登录令牌分配给进程。 允许进程执行。

.服务记录列表

在从已安装服务的数据库中读取每个服务条目时,SCM会为该服务创建一个服务记录。服务记录包括以下内容:

  • 服务名称
  • 启动类型(自动启动或按需启动)
  • 服务状态(参见 SERVICE_STATUS 结构)
  • 类型
  • 当前状态
  • 可接受的控制代码
  • 退出码
  • 等待提示
  • 依赖列表指针

在安装服务时,会指定帐户的用户名和密码。SCM将用户名存储在注册表中,将密码存储在本地安全机构(LSA)的安全部分中。系统管理员可以创建永不过期的带密码的帐户。或者,系统管理员可以创建具有过期密码的帐户,并定期更改密码来管理这些帐户。

SCM保留用户帐户密码的两个副本,一个是当前密码,一个是备份密码。第一次安装服务时指定的密码被存储为当前密码,并且备份密码未初始化。当SCM尝试以用户帐户的安全上下文运行服务时,它使用当前密码。如果当前密码成功使用,它也会保存为备份密码。如果使用ChangeServiceConfig函数或服务控制面板实用程序修改密码,则新密码存储为当前密码,先前的密码存储为备份密码。如果SCM尝试启动服务并且当前密码失败,则使用备份密码。如果备份密码成功使用,则保存为当前密码。

当服务使用SetServiceStatus函数向SCM发送状态通知时,SCM会更新服务状态。SCM通过查询I/O系统来维护驱动程序服务的状态,而不是像从服务中接收状态通知那样。

服务可以通过调用SetServiceBits函数注册附加类型信息。NetServerGetInfo和NetServerEnum函数获取支持的服务类型。

.SCM(Service Control Manager)句柄

SCM支持句柄类型,以允许访问以下对象:

  1. 已安装服务的数据库。
  2. 一个服务。
  3. 数据库锁。

SCManager对象代表已安装服务的数据库。它是一个容器对象,保存着服务对象。OpenSCManager函数返回一个句柄,用于表示指定计算机上的SCManager对象。在安装、删除、打开和枚举服务以及锁定服务数据库时,使用该句柄。

服务对象代表一个已安装的服务。CreateService和OpenService函数返回已安装服务的句柄。

OpenSCManager、CreateService和OpenService函数可以请求对SCManager和服务对象的不同类型的访问权限。所请求的访问权限将根据调用进程的访问令牌和与SCManager或服务对象相关联的安全描述符而被授予或拒绝。

CloseServiceHandle函数用于关闭对SCManager和服务对象的句柄。当您不再需要这些句柄时,请确保关闭它们。

服务程序

.服务程序

一个服务程序包含一个或多个服务的可执行代码。使用类型为SERVICE_WIN32_OWN_PROCESS创建的服务程序仅包含一个服务的代码。使用类型为SERVICE_WIN32_SHARE_PROCESS创建的服务程序包含多个服务的代码,使它们可以共享代码。一个实现这一功能的服务程序的示例是通用服务主机进程Svchost.exe,它托管内部的Windows服务。请注意,Svchost.exe被操作系统保留使用,非Windows服务不应使用它。开发人员应该实现自己的服务托管程序。

一个服务程序可以配置为在内置(本地)、主要或受信任的域的用户帐户上下文中执行。它还可以配置为在特殊的服务用户帐户中运行。

以下主题描述了服务程序必须包含的服务控制管理器(SCM)接口要求:

服务入口点 服务ServiceMain函数 服务控制处理程序函数 这些主题不适用于驱动程序服务。有关驱动程序服务的接口要求,请参阅Windows驱动程序开发工具包(WDK)。

服务作为后台进程运行,可能会影响系统的性能、响应性、能效和安全性。有关服务优化指南,请参阅为Windows开发高效的后台进程。以下主题描述了其他编程注意事项:

服务状态转换 在服务中接收事件 多线程服务 服务和注册表 服务和重定向驱动器 服务触发事件 请注意,如果服务程序充当RPC服务器,应使用动态端点和相互认证。

最近更新

  1. TCP协议是安全的吗?

    2024-01-13 13:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-13 13:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-13 13:46:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-13 13:46:01       20 阅读

热门阅读

  1. XTdrone运行ego需打开多个终端 麻烦 一键启动脚本

    2024-01-13 13:46:01       38 阅读
  2. mvvm相关

    2024-01-13 13:46:01       26 阅读
  3. YOLOV8在coco128上的训练

    2024-01-13 13:46:01       31 阅读
  4. 安卓MediaRecorder(3)音频采集编码写入详细源码分析

    2024-01-13 13:46:01       31 阅读
  5. 【Delphi 基础知识 17】注释代码的几种方法

    2024-01-13 13:46:01       32 阅读
  6. QT中程序执行时间精准计算的三种方法及对比

    2024-01-13 13:46:01       29 阅读