C++实现系统黑屏

article/2025/10/8 5:34:16

定义

电脑黑屏通常有两种定义,一种是指硬件黑屏,包括但不限于硬件故障、断电、显示器被硬件或软件关闭等;另一种是指系统层面上的黑屏,两种黑屏的最大差别就是系统层面上的黑屏会发光,而硬件黑屏则基本上不会。

这里讲的是使用C++进行系统层面上的黑屏。

为了读者能够不加修改的复现,这里使用的是Win32程序。

知识链接

C++ while 循环 | 菜鸟教程C++ while 循环 C++ 循环 只要给定的条件为真,while 循环语句会重复执行一个目标语句。 语法 C++ 中 while 循环的语法: while(condition) { statement(s); } 在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。 当条件为假时,程序流将继续..https://www.runoob.com/cplusplus/cpp-while-loop.htmlGetDesktopWindow function (winuser.h) - Win32 apps | Microsoft DocsRetrieves a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which other windows are painted.https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdesktopwindowGetWindowDC function (winuser.h) - Win32 apps | Microsoft DocsThe GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars.https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowdcBitBlt function (wingdi.h) - Win32 apps | Microsoft DocsThe BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-bitblt

API详解

首先需要用到以下几个系统API。

  • GetDesktopWindow
  • GetWindowDC
  • BitBlt

接下来一一讲解。

GetDesktopWindow

字面意思:获取桌面窗口,也就是获取桌面所属的窗口。

函数原型:

WINUSERAPI HWND WINAPI GetDesktopWindow(VOID);

调用此API后。将会返回一个系统桌面所对应的窗口句柄,可用HWND数据类型接收,如:

HWND hWnd = ::GetDesktopWindow();

在该程序中的意义:获取窗口句柄,以便获取DC。


GetWindowDC

字面意思:获取窗口的DC

函数原型:

WINUSERAPI HDC WINAPI GetWindowDC(_In_opt_ HWND hWnd);

调用此API,需要传入一个数据类型为HWND的窗口句柄,这个参数为要获取DC的窗口。

调用后返回一个类型为HDC的绘画控制版(DC),可以用于对窗口展现内容进行操作,如:

HDC hdc = ::GetWindowDC(hWnd);

在该程序中的意义:为后续向窗口绘制黑色内容作准备。


BitBlt

字面意思:比特复制

作用:将一个DC(绘画控制板)或预设中的内容复制到另一个DC。

误区:该API只会复制内容,而其他信息则会直接忽略。

函数原型:

WINGDIAPI BOOL  WINAPI BitBlt( _In_ HDC hdc, _In_ int x, _In_ int y, _In_ int cx, _In_ int cy, _In_opt_ HDC hdcSrc, _In_ int x1, _In_ int y1, _In_ DWORD rop);

参数介绍:

hdc:传入一个类型为HDC的绘画控制板,表示将要复制内容到此的绘画控制板。

x、y:按顺序分别表示复制到目标绘画控制板的左上角的x、y坐标。

cx、cy:按顺序分别表示要复制的矩形的宽度、高度。

hdcSrc:同hdc,但是表示要复制的原绘画控制板,复制的内容来自这个绘画控制板。

x1、y1:按顺序分别表示要复制的原矩形的左上角的x和y坐标,宽度和高度由cx、cy决定。

rop:光栅操作代码。这些代码定义了如何将源矩形的颜色数据与目标矩形的颜色数据组合以实现最终颜色。

MSDN提供的操作代码:

ValueMeaning

BLACKNESS

Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)

CAPTUREBLT

Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. Note that this generally cannot be used for printing device contexts.

DSTINVERT

Inverts the destination rectangle.

MERGECOPY

Merges the colors of the source rectangle with the brush currently selected in hdcDest, by using the Boolean AND operator.

MERGEPAINT

Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator.

NOMIRRORBITMAP

Prevents the bitmap from being mirrored.

NOTSRCCOPY

Copies the inverted source rectangle to the destination.

NOTSRCERASE

Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color.

PATCOPY

Copies the brush currently selected in hdcDest, into the destination bitmap.

PATINVERT

Combines the colors of the brush currently selected in hdcDest, with the colors of the destination rectangle by using the Boolean XOR operator.

PATPAINT

Combines the colors of the brush currently selected in hdcDest, with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator.

SRCAND

Combines the colors of the source and destination rectangles by using the Boolean AND operator.

SRCCOPY

Copies the source rectangle directly to the destination rectangle.

SRCERASE

Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator.

SRCINVERT

Combines the colors of the source and destination rectangles by using the Boolean XOR operator.

SRCPAINT

Combines the colors of the source and destination rectangles by using the Boolean OR operator.

WHITENESS

Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)

很显然,由于我们需要让系统黑屏,需要使用 BLACKNESS这个宏,这是决定所复制的内容的关键。


具体实现

由于随时都可能有窗口被刷新,而刷新则会破坏掉我们所复制的环境,因此我们需要源源不断的使系统黑屏,那么使用死循环可能是最好的办法。

将我们前面所讲的结合起来,于是便得到了:

#include "stdafx.h"
#include "systemblack.h"int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow)
{HWND hwnd = ::GetDesktopWindow();  //获取桌面句柄HDC hdc = ::GetWindowDC(hwnd); //获取桌面上下文的句柄while (1) //死循环{BitBlt(hdc, 0, 0,GetSystemMetrics(SM_CXSCREEN),/*获取屏幕宽度*/GetSystemMetrics(SM_CYSCREEN),/*获取屏幕高度*/hdc, 0, 0, BLACKNESS);}return 0;
}

发行版直达链接:c++实现系统黑屏-Release编译版-桌面系统文档类资源-CSDN下载对应博文地址:https://blog.csdn.net/qq_59942146/article/d更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_59942146/86239635

gitee仓库(带发行版):https://gitee.com/love-programming-of-yeyixiao/c-realize-system-black-screen

github仓库(带发行版):

GitHub - love-code-yeyixiao/systemblackscreen

虽然代码并不难,但打字耗时间啊,起码来个点赞吧。


http://chatgpt.dhexx.cn/article/EiEqbQVb.shtml

相关文章

C语言课程设计项目

C语言课程设计项目 团队介绍单位名怀化学院计算机科学与工程学院班级小组序号1901班第八组团队名称潜力无限组课程设计题目学生限时答题评测系统 一、课程设计题目基本要求介绍 (1) 输入信息:学生输入自己的学号姓名作为学生基本信息&…

C语言源码做的通讯录管理系统课程设计(源码+课程设计报告)

一、课程设计的目的: C语言课程设计是计算机科学与技术专业重要的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C语言程序设计的知识点,又接近工程实际需要。本次设计的目的是通过课程设计的综合训练&#xf…

C语言源码做的班级档案管理系统课程设计(源码+课程设计报告)

一、课程设计的目的: C语言课程设计是计算机科学与技术专业重要的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C语言程序设计的知识点,又接近工程实际需要。本次设计的目的是通过课程设计的综合训练&#xf…

【C++程序设计】课程设计报告

作者:何翔 学院:计算机学院 学号:04191315 班级:软件1903 完整资料:https://download.csdn.net/download/HXBest/75523613 项目资料下载:https://download.csdn.net/download/HXBest/21947475

C语言——课程设计

一、实验目的 了解开发环境掌握结构体变量的定义和使用;掌握结构体数组的定义和使用;掌握文件输入,输出基本方法掌握函数用法 二、实验内容 【项目1】完成以下功能的设计。 此学生成绩管理可以实现对学生成绩及基本信息进行创建、添加、删…

学生成绩管理系统-C语言(附源码和课程设计报告)

学生成绩管理系统-C语言&#xff08;附源码和课程设计报告&#xff09; 这是我初学C语言时的课程设计作业&#xff0c;源码贴出来希望对有需要的小伙伴有所帮助 系统功能层次图 头文件源代码 #include<stdio.h> #include<stdlib.h> #define FILENAME"stude…

通讯录管理系统 C语言课程设计实验报告

通讯录管理系统C语言课程设计 一、实验目的 1.巩固和加深学生对C语言课程的基本知识的理解和掌握 2.掌握C语言编程和程序调试的基本技能 3.利用C语言进行基本的软件设计 4.掌握书写程序设计说明文档的能力 5.提高运用C语言解决实际问题的能力 二.程序要求 学生信息包括&#x…

C语言学生成绩管理系统(课程设计报告书)

今天再跟大家分享一份课程设计报告&#xff1a;C语言学生成绩管理系统源码 程序设计组成框图&#xff1a; #include<stdio.h> #include<conio.h> #include<malloc.h> #include<string.h>typedef struct STUDENT { char studentNumber[10];/*学生学号*/…

记录C语言课程设计报告-图书管理系统

倾心原创&#xff0c;转载请备注原文地址&#xff0c;谢谢。 主要内容&#xff1a; 图书信息包括&#xff1a;书名、作者名、ISBN号、出版单位、出版年份、价格等。试设计一个图书信息管理系统&#xff0c;使之能提供以下功能&#xff1a; &#xff08;1&#xff09;系统以菜…

C语言课程设计

《C语言课程设计》任务书 课程设计名称&#xff1a;C语言课程设计&#xff08;C Language Designing &#xff09; 课程设计学分&#xff1a;1学分 课程设计时间&#xff1a;第一学年第1学期 课程设计学时&#xff08;周数&#xff09;&#xff1a;28学时&#xff08;1周&…

C语言课程设计报告-菜单设计

源代码&#xff1a;https://blog.csdn.net/queen00000/article/details/94468911 xxx大学 C语言课程设计报告 题 目 菜单设计 专业班级 组 别 学生姓名…

连续邮资问题

1、实验环境 Visual C 6.0 2、实验目的和要求 利用回溯法解决连续邮资问题。假设某国家发行了n种不同面值的邮票并且规定每张信封上最多只允许贴m张。对于给定的n和m的值&#xff0c;给出邮票面值的最佳设计&#xff0c;使得可在1张信封上贴出从邮资1开始&#xff0c;增量为…

寄信收信问题

问题 在一个村庄里有i个人&#xff0c;他们每个人只能寄出一封信&#xff0c;接收一封信&#xff0c;并且不能给自己寄信。那么请问一共有多少种寄信收信方式。 思路 遇到此类问题&#xff0c;应该从简单的情况考虑。比如&#xff0c;当村里只有两个人的时候&#xff0c;只有…

【图论】中国邮递员问题、平面图上最大割问题的多项式时间算法

文章目录 一、中国邮递员问题1. 与欧拉回路的关系2. Edmonds-Johnson算法3. 一个例子 二、平面图上的最大割问题1. 割2. 最大割及其 N P \bold{NP} NP完全性3. 平面图上的最大割问题4. 奇回路覆盖5. 转化为一般图最大匹配6. 一个例子 三、顶点图上最大割问题的 N P \bold{NP} N…

AMPL实现中国邮递员问题,你get到了吗

本文所有代码全部使用AMPL语言实现 中国邮递员问题和旅行商问题不太相同&#xff0c;旅行商问题是不能回头的&#xff0c;而邮递员问题要求是访问所有街道&#xff0c;也就是说每个街道必须访问到。 1、哥尼斯堡七桥问题 要解出中国邮递员问题&#xff0c;首先我们一起来了解…

关于中国邮递员问题和欧拉图应用

关于中国邮递员问题和欧拉图应用 中国邮递员问题&#xff1a; 1962年有管梅谷先生提出中国邮递员问题&#xff08;简称CPP&#xff09;。一个邮递员从邮局出发&#xff0c;要走完他所管辖的每一条街道&#xff0c;可重复走一条街道&#xff0c;然后返回邮局。任何选择一条尽可…

欧拉环游和中国邮递员问题

文章目录 前言欧拉环游Fleury算法中国邮递员问题 前言 这篇文章介绍了欧拉环游的定义判定&#xff0c;Fleury算法求欧拉图中的欧拉环游&#xff0c;最后给出了中国邮递员问题的解决步骤。 欧拉环游 所谓欧拉环游就是指在一个无向图中&#xff0c;从一个点出发&#xff0c;每…

中国邮递员问题最短路径(代码+实现)

奇点需要配合LINGO进行去除&#xff0c;有需要请联系1822285076qq.com&#xff0c;需要一定费用。 总程序&#xff1a; 奇点消除lingo代码&#xff1a;

一笔画问题(中国邮递员问题)

一笔画与中国邮递员问题 一、引述 一笔画问题&#xff1a; 节点可以重复走边不可以重复走要求把所有边都走一次 欧拉图(Euler graph)&#xff1a; 从任何节点开始&#xff0c;都可以一笔画 每一个节点都是偶数价&#xff08;价数指的是从该节点能够伸出去的边的数目&#x…

用遗传算法解决中国邮递员问题

中国邮递员问题 所谓中国邮递员问题&#xff0c;见下面无向图 &#xff0c;假设邮递员初始位置在A点&#xff0c;现在他要访问所有其他4个结点以便投递邮件&#xff0c;结点与结点之间的距离已经标注在边上。问&#xff1a;邮递员应该依次访问哪些结点才能以最短路径遍历所有结…