Win32 C++实现服务、桌面图标窗口层、广告弹窗以及无任务栏图标程序

本文主要是介绍Win32 C++实现服务、桌面图标窗口层、广告弹窗以及无任务栏图标程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎各位大家关注本人微信公众号:程序员JC,小程序:RobotJC 里面包含很多本人之前做的小案例(包含源码以及资源),也许这里有你想要的东西哦。

这篇文章其实几周前,我就想写了。但是鉴于我个人的一些事情,导致我没有心思和心情去写。但是,之后我想想不应该这样继续下去。所以借这篇文章机会,我衷心希望各位看到这篇文章的朋友,能生活的像题图上写的一样,“纵使生活跌倒一百次,也要一百零一次地站起来”。因为好的心态生活真的很重要。好了,不讲大道理了,哈哈。开始说正事了。

我为什么会写这个程序?

首先,说明一下,我是一个晚睡晚起的程序员(哈哈,不知道各位同僚的程序员作息如何)。加上疫情期间一直在家待着,这种晚睡晚起的习惯愈演愈烈(睡的更晚,起的更晚),而且缺乏各种锻炼。不像之前上班,尽管的睡的很晚,但是第二天会因为上班有时会强制自己早睡而且每天饮食正常,会跑步锻炼。我也意识到自己的这个问题,也想过改正,但是每到晚上就会非常精神,而且还有很多理由说服自己,是不是就像民间里流传的寒号鸟故事,哈哈。

我也具体分析过,导致我晚睡的最直接因素主要有两个,一个是手机,一个电脑。所以从我一个程序员角度出发,有没有什么办法能让我写一个程序,在指定的时间段内强制关机手机和电脑,而且在指定的时间段内容只要一开机就会关机(大概就是这么情况,对了千万不要留一手后路,如果留了也会去说服自己每次走后路,至少我会这样,嘿嘿。如果有必要的特殊情况需要在这段指定的时间段内要是用手机或设备,这时可以给条后路,但是一定要麻烦,不能太过容易,因为我个人觉得如果十分必要,再麻烦也会去处理的)。

但是,需要考虑实际的是,我目前只能从电脑进行实时,但是在手机上我没有进行深入研究。我私底下也会去研究这方面的技术,如果各位同僚知道如何操作,也可以各位分享一下,谢谢!接下来,我都是讲如何从电脑实现我上述需求。

将白话需求转成技术需求?

这里,我只说个大概,然后列出几点核心技术需求。如果要想写的程序有较高的权限,所以用户不是很容易找到程序的源头,也不容易把程序杀掉。而且在关机前几分钟要有提示信息,防止用户数据丢失。

需求一:无任务栏图标弹窗倒计时提示?防止用户直接关闭,也不能遮盖其他应用程序。

需求二:从任务管理器隐藏程序,服务程序形式?防止用户直接
从任务管理器杀掉进程。

需求三:轮询服务、监听服务以及提示应用进程?轮询服务是防止监听服务异常,监听服务是防止提示应用程序异常,但是关机等执行命令依然在监听服务执行。

需求四:安装及卸载程序?安装初始化,卸载释放。

需求具体实现?

这里先说明一下,本程序一共包含5个进程,分别是安装进程(管理员权限)、卸载进程(管理员权限)、轮询服务进程(管理员权限、服务程序)、监听服务进程(服务程序)以及提示窗口进程。以下只给出部分源码,末尾会给出源码链接地址。

安装进程:只可安装一次,如需重复安装,必须先卸载。这个阶段可以添加计划,其中系统计划标题不可修改,只可修改时段。这个进程会创建并且启动轮询服务进程和监听服务进程。

卸载进程:会停止及删除轮询服务进程和监听服务进程。如果此前执行过安装进程,则执行该进程后,即可重新执行安装进程。

轮询服务进程:循环检测监听服务进程状态,如果被卸载,则执行安装及启动操作;如果被停止,则执行启动操作。

监听服务进程:读取计划项数据,循环检测计划状态,计划一旦触发则轮询提示窗口进程状态。如果未启动,则执行启动操作。

提示窗口进程:该窗口进程是运行在桌面之上,图标之下,是因为只能起一个提示作用,不可覆盖其他程序(类似广告)。隐藏任务栏图标,主要为了防止用户直接关闭。

需求一:无任务栏图标弹窗倒计时提示
这里我就不对Win32窗口程序操作进行详细说明了,主要包含注册窗口RegisterClass、创建窗口CreateWindow以及消息轮询回调DefWindowProc几个步骤。忘记了的或者不清楚的请自行学习。

要想任务栏不显示引用程序图标,创建窗口需要使用API CreateWindowEx,第一个参数引入WS_EX_TOOLWINDOW以及第二个参数引入WS_POPUP即可,则可实现任务栏图标隐藏。

要想实现窗口透明化、任意形状窗口或者广告形式的弹窗,在创建窗口需要使用API CreateWindowEx,第一个参数引入WS_EX_LAYERED以及第二个参数引入WS_POPUP即可,之后需要调用API过滤窗口背景颜色。这里如果我选的窗口背景颜色是纯白色,则需要执行下面的代码则可实现窗口滤色。

//第一个参数,窗口句柄
//第二个参数,窗口背景颜色
//第三个参数, [0,1]/[0-255]
//第四个参数,LWA_COLORKEY/LWA_ALPHA
SetLayeredWindowAttributes(g_hWindow, RGB(255, 255, 255), 1, LWA_COLORKEY);

窗口绘制操作,这里如果要想实现任意形状的窗口绘制。则需要对矢量图进行操作(诸如:.PNG和.gif之类的)。我这里使用的Win32GDI+,因为GDI+可以操作PNG及GIF的矢量图。之所以不使用Win32GDI,使用GDI只可操作位图(BMP),比较局限,但是效率会比GDI+高很多。先粗略说明一下,如果需要是使用GDI+,需要最开始初始化一下,然后最后在进行释放。见下:

INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, INT nCmdShow)
{//初始化ULONG_PTR gdiplusStartupToken;GdiplusStartupInput gdiInput;GdiplusStartup(&gdiplusStartupToken, &gdiInput, NULL);/* 执行逻辑(start) *//* 执行逻辑(end) *///释放GdiplusShutdown(gdiplusStartupToken);return 0;
}

截图前后对比:
在这里插入图片描述

需求二:从任务管理器隐藏程序,服务程序形式
如需实现服务程序,不能像开发传统的Win32窗口程序或者控制台程序。不过也有点类似,主函数main就行,不需要WinMain。这里关心一下SERVICE_TABLE_ENTRY这个结构,结构里的程序包含服务名和入口函数,这个结构填充完后,需要使用API StartServiceCtrlDispatcher执行,然后该应用程序就是服务程序了。

入口函数是int func(int argc, const char *argv[]),参数就是main函数的入口参数。在入口函数中还需要实现SERVICE_STATUS这个结构。这个结构填充完后,需要调用API RegisterServiceCtrlHandler 和 SetServiceStatus 程序编译成功后,也是以exe后缀形式存在,启动之后不可在任务管理器中找到该服务程序,只能在服务管理器中能查看,见下图:
在这里插入图片描述

需求三:轮询服务、监听服务以及提示应用进程
轮询服务、监听服务以及提示应用进程都是在同一个层级目录下,不可随意移动位置。但是这里有个问题,因为安装进程和卸载进程是在上面三个进程的上一级目录,而安装进程会直接安装并启动轮询服务和监听服务进程,这里就会出现工作路径问题。所以需要在每个应用程序最开始需要显示设置进程工作路径,调用API SetCurrentDirectory即可。具体路径结构见下:
在这里插入图片描述

需求四:安装及卸载程序
这里的安装及卸载都是需要管理员权限的。考虑到服务程序没法直接卸载,所以这里提供了卸载程序。需要说明的是,安装程序的时候会写入计划项数据,并且会调用科大讯飞三方库并合成相关的提示音。

总结

到这里,该程序的核心需求及其难点均已实现。这里可能有的同僚会问这里广告弹窗是怎么回事,好像没有提到?的确,是没有提到。这里我说的只是一种方式。上述的服务程序窗口形式就是目前大多windows系统上的广告弹出形式,我这里想要表述的只是形式而已。只要弄懂了我上述说的服务程序及提示,便可实现弹窗。祝各位感兴趣的同僚早日实现哈!加油!

这里最后需要说明一下的事,尽管在电脑上,实现了我的上述需求。但是在实际当中,并没什么卵用。我还是晚睡晚起,哈哈。所以说打铁还需自身硬啊。这个是值得我反思的问题,不过从技术上我也算多学习了一样。嘿嘿。

最后附上源码地址:
链接:https://pan.baidu.com/s/1sj1iLKLs0fb2seUXjVa5Aw
提取码:rtjv

这篇关于Win32 C++实现服务、桌面图标窗口层、广告弹窗以及无任务栏图标程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739597

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端