编写service服务参考网址:https://blog.csdn.net/nodeathphoenix/article/details/24181509

vc获得显示器状态(捕获息屏、亮屏网址):https://blog.csdn.net/rocklee/article/details/76636253

Service_test.cpp

// Service_test.cpp : This file contains the 'main' function. Program execution begins and ends there.
// #include "pch.h"
#include <Windows.h>
#include <iostream>
using namespace std; //#include <Windows.h>//Win32函数
//#include <stdio.h>//磁盘文件写入
//#pragma comment(lib, "Advapi32") /**SLEEP_TIME指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环的时候要使用该常量
LOGFILE指定日志文件的路径
*/
//#define SLEEP_TIME 5000
//#define LOGFILE "F:\\vc_work\\20190530\\Service_test\\memstatus.txt"
//
////声明全局变量
//SERVICE_STATUS ServiceStatus;
//SERVICE_STATUS_HANDLE hStatus; //前向定义函数
//void ServiceMain(int argc, char** argv);
//void ControlHandler(DWORD request);
//int InitService();
//int WriteToLog(const char* str);
//void LightingBar_control(); //#include <iostream>
//using namespace std; HWND mhMsgRec; LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
HWND createMsgWin() {
HINSTANCE lvhInstance;
lvhInstance = GetModuleHandle(NULL); //获取一个应用程序或动态链接库的模块句柄
WNDCLASS lvwcCls;
lvwcCls.cbClsExtra = 0;
lvwcCls.cbWndExtra = 0;
lvwcCls.hCursor = LoadCursor(lvhInstance, IDC_ARROW); //鼠标风格
lvwcCls.hIcon = LoadIcon(lvhInstance, IDI_APPLICATION); //图标风格
lvwcCls.lpszMenuName = NULL; //菜单名
lvwcCls.style = CS_HREDRAW | CS_VREDRAW; //窗口的风格
lvwcCls.hbrBackground = (HBRUSH)COLOR_WINDOW; //背景色
lvwcCls.lpfnWndProc = WindowProc; //【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc
lvwcCls.lpszClassName = L"RenderWindow"; //【关键】该窗口类的名称
lvwcCls.hInstance = lvhInstance; //【关键】表示创建该窗口的程序的运行实体代号 RegisterClass(&lvwcCls); HWND lvhwndWin = CreateWindow(
L"RenderWindow", //【关键】上面注册的类名lpszClassName,要完全一致
L"Zombie", //窗口标题文字
WS_OVERLAPPEDWINDOW, //窗口外观样式
0, //窗口相对于父级的X坐标
0, //窗口相对于父级的Y坐标
30, //窗口的宽度
20, //窗口的高度
NULL, //没有父窗口,为NULL
NULL, //没有菜单,为NULL
lvhInstance, //当前应用程序的实例句柄
NULL); //没有附加数据,为NULL //去标题栏 //ShowWindow(lvhwndWin, SW_SHOW); //显示窗体
//ShowWindow(HButton, SW_SHOW); //显示窗体
//UpdateWindow(lvhwndWin); //绘制窗体;
//UpdateWindow(HButton); //绘制窗体; return lvhwndWin;
} LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
//cout << "MSG:" << uMsg << ",wParam:" << wParam << ",lParam:" << lParam << endl;
switch (uMsg)
{ case WM_POWERBROADCAST:
{
if (wParam == PBT_POWERSETTINGCHANGE) {
POWERBROADCAST_SETTING* lvpsSetting = (POWERBROADCAST_SETTING*)lParam;
byte lvStatus = *(lvpsSetting->Data);
if (lvStatus != 0) {
cout << "Monitor is turn on" << endl;
}
else {
cout << "Monitor is turn off" << endl;
}
//cout << (int)lvStatus << endl; }
break;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
} BOOL WINAPI ConsoleHandler(DWORD pvdwMsgType)
{
if (pvdwMsgType == CTRL_C_EVENT)
{
PostMessage(mhMsgRec, WM_DESTROY, 0, 0);
return TRUE;
}
else if (pvdwMsgType == CTRL_CLOSE_EVENT)
{
PostMessage(mhMsgRec, WM_DESTROY, 0, 0);
return TRUE;
}
return FALSE;
} int main()
{
mhMsgRec = createMsgWin();//这个函数也是dll里的,得到控制台的句柄 HPOWERNOTIFY lvhpNotify = RegisterPowerSettingNotification(mhMsgRec, &GUID_CONSOLE_DISPLAY_STATE, DEVICE_NOTIFY_WINDOW_HANDLE); SetConsoleCtrlHandler(ConsoleHandler, TRUE);
bool lvbRet;
MSG lvMSG;
while ((lvbRet = GetMessage(&lvMSG, NULL, 0, 0)) != 0)
{
TranslateMessage(&lvMSG);
DispatchMessage(&lvMSG);
if (lvMSG.message == WM_DESTROY) {
break;
}
}
UnregisterPowerSettingNotification(lvhpNotify);
CloseWindow(mhMsgRec);
return 0;
} //创建分派表并控制分派机
//int main()
//{
//*lpServiceName: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须指定
// lpServiceProc: 指向服务主函数的指针(服务入口点)
// 分派表的最后一项必须是服务名和服务主函数域的 NULL 指针,文本例子程序中只宿主一个服务,所以服务名的定义是可选的*/
//SERVICE_TABLE_ENTRY ServiceTable[2];
//ServiceTable[0].lpServiceName = (LPWSTR)(L"MemoryStatus");
//ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; //ServiceTable[1].lpServiceName = NULL;
//ServiceTable[1].lpServiceProc = NULL; //StartServiceCtrlDispatcher(ServiceTable);
//} //注册控制处理器函数
//void ServiceMain(int argc, char** argv)
//{
// int error;
//
// //指示服务类型,创建Win32服务。赋值SERVICE_WIN32
// ServiceStatus.dwServiceType = SERVICE_WIN32;
// //指定服务的当前状态,因为服务的初始化在这里没有完成,所以状态为SERVICE_START_PENDING;
// ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
// //这个域通知 SCM 服务接受哪个域。本文例子是允许 STOP 和 SHUTDOWN 请求。处理控制请求将在第三步讨论;
// ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
// //dwWin32ExitCode 和 dwServiceSpecificExitCode 这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0
// ServiceStatus.dwWin32ExitCode = 0;
// ServiceStatus.dwServiceSpecificExitCode = 0;
// //dwCheckPoint 和 dwWaitHint :这两个域表示初始化某个服务进程时要30 秒以上。本文例子服务的初始化过程很短,所以这两个域的值都为 0
// ServiceStatus.dwCheckPoint = 0;
// ServiceStatus.dwWaitHint = 0;
//
// hStatus = RegisterServiceCtrlHandlerEx(
// L"LightingBar",
// (LPHANDLER_FUNCTION_EX)ControlHandler, NULL);
// if (hStatus == (SERVICE_STATUS_HANDLE)0)
// {
// // Registering Control Handler failed
// return;
// }
//
// /*
// The current monitor's display state has changed.
// 0x0 - The display is off.
// 0x1 - The display is on.
// 0x2 - The display is dimmed.
// */
// HPOWERNOTIFY hPowerNotify;
// hPowerNotify = RegisterPowerSettingNotification(hStatus, &GUID_CONSOLE_DISPLAY_STATE, DEVICE_NOTIFY_SERVICE_HANDLE);
//
// //UnregisterPowerSettingNotification(hPowerNotify);
//
//
// // Initialize Service
// error = InitService();
// if (!error)
// {
// // Initialization failed
// ServiceStatus.dwCurrentState =
// SERVICE_STOPPED;
// ServiceStatus.dwWin32ExitCode = -1;
// SetServiceStatus(hStatus, &ServiceStatus);
// return;
// }
// // We report the running status to SCM.
// ServiceStatus.dwCurrentState = SERVICE_RUNNING;
// SetServiceStatus(hStatus, &ServiceStatus);
//
//
// //启动工作循环。每5秒钟查询一个可用物理内存并将结果写入日志文件
// MEMORYSTATUS memory;
// // The worker loop of a service
// while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
// {
// //char buffer[16];
// //GlobalMemoryStatus(&memory);
// ///*DWORD dwLength; 使用之前先令其等于结构的大小
// //dwMemoryLoad:内存负载率,其实也就是内存使用率
// //dwTotalPhys:总的物理内存,我在我的512MB虚拟机上测试为536330240bytes,比512MB少540672bytes,其实这部分被用作引导进程
// //dwAvailPhys:可用的物理内存=dwTotalPhys*(1-dwMemoryLoad)
// //dwTotalPageFile:总的页面文件的大小,其实就是物理内存加虚拟内存的总大小,但是这里有个问题,物理内存少了一部分*/
// //sprintf_s(buffer, "%d", memory.dwAvailPhys);//memory.dwAvailPhys:可用的物理内存=dwTotalPhys*(1-dwMemoryLoad)
// //int result = WriteToLog(buffer);
// //if (result)
// //{
// // ServiceStatus.dwCurrentState = SERVICE_STOPPED;
// // ServiceStatus.dwWin32ExitCode = -1;
// // SetServiceStatus(hStatus, &ServiceStatus);
// // return;
// //}
// //Sleep(SLEEP_TIME);
// LightingBar_control();
// }
// return;
//} /*在第二步中,你用 ServiceMain 函数注册了控制处理器函数。控制处理器与处理各种 Windows 消息的窗口回调函数非常类似。它检查 SCM 发送了什么请求并采取相应行动。
  每次你调用 SetServiceStatus 函数的时候,必须指定服务接收 STOP 和 SHUTDOWN 请求。Listing 2 示范了如何在 ControlHandler 函数中处理它们。
  STOP 请求是 SCM 终止服务的时候发送的。例如,如果用户在“ 服务” 控制面板中手动终止服务。SHUTDOWN 请求是关闭机器时,由 SCM 发送给所有运行中服务的请求*/
//void ControlHandler(DWORD request)
//{
// switch (request)
// {
// case SERVICE_CONTROL_STOP:
// WriteToLog("Monitoring stopped.");
// ServiceStatus.dwWin32ExitCode = 0;
// ServiceStatus.dwCurrentState = SERVICE_STOPPED;
// SetServiceStatus(hStatus, &ServiceStatus);
// return;
//
//
// case SERVICE_CONTROL_SHUTDOWN:
// WriteToLog("Monitoring stopped.");
// ServiceStatus.dwWin32ExitCode = 0;
// ServiceStatus.dwCurrentState = SERVICE_STOPPED;
// SetServiceStatus(hStatus, &ServiceStatus);
// return;
//
// default:
// break;
// }
//
// // Report current status
// SetServiceStatus(hStatus, &ServiceStatus);
// return;
//} //将内存查询输出到文件
//int WriteToLog(const char* str) {
// FILE* log;
// errno_t err;
// err = fopen_s(&log, LOGFILE, "a+");
// if (log == NULL) {
// return -1;
// }
// fprintf(log, "%s\n", str);
// fclose(log);
// return 0;
//
//}
//
//int InitService() {
// WriteToLog("Monitoring started.");
// return true;
//} //void LightingBar_control() {
//
//} // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started:
// 1. Use the Solution Explorer window to add/manage files
// 2. Use the Team Explorer window to connect to source control
// 3. Use the Output window to see build output and other messages
// 4. Use the Error List window to view errors
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file

设置情况

第八篇--编写Windows服务的更多相关文章

  1. C#编写windows服务

    项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ...

  2. 使用C语言编写windows服务一般框架

    原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...

  3. C#编写Windows 服务

    C#编写Windows 服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时 ...

  4. python实现编写windows服务

    使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ...

  5. C# 编写windows服务及服务的安装、启动、删除、定时执行任务

    一.编写windows服务 1.VS2017  - 创建服务Myservice 2.创建好项目之后 --- >> 双击 Service1.cs  ---- >>  出现一个设计 ...

  6. c# 编写windows 服务,并制作安装包

    对服务的认识有很多个阶段. 第一阶段:当时还在用c++,知道在一个进程里while(True){},然后里面做很多很多事情,这就叫做服务了,界面可能当时还用Console控制台程序. 第二阶段:知道了 ...

  7. 编写Windows服务疑问1:操作过程

    Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...

  8. 手把手教用C#编写Windows服务 并控制服务 安装、启动、停止、卸载

    Windows服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动, ...

  9. 黑客编程教程(八)编写NT服务

    先介绍一下什么是NT服务,实际上就是一个可以在系统启动时自动在一定身份下启动的,伴随着系统长期存在的进程. 一个NT服务有三部分构成: :Service Control Manager(SCM) 每个 ...

随机推荐

  1. 【NX二次开发】Block UI 指定点

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  2. redHat6设置ip地址

    产生需求的原因: 最近新安装了redhat6,可是在相互ping的过程中发现redhat6的并没有配置静态的ip地址,于是我尝试使用windows的方式去配置,可效果并不如意,于是如何在redhat6 ...

  3. 迁移Report Server DataBase时遇到的坑

    1.项目背景 由于历史原因,公司部分系统的Report是基于SQL Server Report Service搭建的,且Reporting Services 和Report Server DataBa ...

  4. sql数据库新建作业,新建步骤时报错从 IClassFactory 为 CLSID 为 {AA40D1D6-CAEF-4A56-B9BB-D0D3DC976BA2} 的 COM 组件创建实例失败,原因是出现以下错误: c001f011。 (Microsoft.SqlServer.ManagedDTS)

    简单粗暴的重启sql数据库 其他网上找的方法 32位操作系统: 打开运行(命令提示符), 一.输入 cd c:\windows\system32 进入到c:\windows\system32路径中 二 ...

  5. Apache Hudi在Hopworks机器学习的应用

    Hopsworks特征存储库统一了在线和批处理应用程序的特征访问而屏蔽了双数据库系统的复杂性.我们构建了一个可靠且高性能的服务,以将特征物化到在线特征存储库,不仅仅保证低延迟访问,而且还保证在服务时间 ...

  6. Kubernetes中予许及限制(PodSecurityPolicy)使用宿主机资源

    1.在pod中使用宿主机命名空间.端口等资源 pod中的容器通常在分开的Linux命名空间中运行.这些命名空间将容器中的进程与其他容器中,或者宿主机默认命名空间中的进程隔离开来. 例如,每一个pod有 ...

  7. 关于基于Nexus3和Docker搭建私有Nuget服务的探索

    背景简介 NuGet是Microsoft开发平台的程序集包管理器,它由客户端工具和服务端站点组成,客户端工具提供给用户管理和安装/卸载软件程序包,以及打包和发布程序包到NuGet服务端站点等功能,服务 ...

  8. 44、djanjo工程(介绍)

    44.1.什么时web框架: 1.框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用看框架可以 帮助你快速开发特定的形同,简单的说,就是你用别人搭建好的舞台来做 ...

  9. Destroying The Graph 最小点权集--最小割--最大流

    Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), ...

  10. 使用过redis做异步队列么,你是怎么用的?有什么缺点?

    Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...