用C++ 实现屏幕保护程序

实现屏幕保护程序的基本思路

屏幕保护程序通常需要全屏显示图形动画,并监听用户输入以退出。以下是一个基于Windows API的简单实现框架:

所需头文件和库

复制代码
#include <windows.h>
#include <tchar.h>
#include <cmath>

全局变量和常量

复制代码
const int TIMER_ID = 1;
const int TIMER_INTERVAL = 30;
bool g_bSaverMode = false;
HWND g_hWnd;
int g_iWidth, g_iHeight;

屏幕保护窗口过程

复制代码
LRESULT CALLBACK ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HDC hdc;
    static PAINTSTRUCT ps;
    static HBRUSH hBrush;
    static int x = 0, y = 0, dx = 5, dy = 5;
    
    switch (message)
    {
    case WM_CREATE:
        SetTimer(hWnd, TIMER_ID, TIMER_INTERVAL, NULL);
        break;
        
    case WM_TIMER:
        // 简单的弹球动画
        hdc = GetDC(hWnd);
        
        // 清除上一帧
        hBrush = CreateSolidBrush(RGB(0, 0, 0));
        FillRect(hdc, &RECT{0, 0, g_iWidth, g_iHeight}, hBrush);
        DeleteObject(hBrush);
        
        // 更新位置
        x += dx;
        y += dy;
        
        // 边界检测
        if (x < 0 || x > g_iWidth - 50) dx = -dx;
        if (y < 0 || y > g_iHeight - 50) dy = -dy;
        
        // 绘制新球
        hBrush = CreateSolidBrush(RGB(255, 0, 0));
        SelectObject(hdc, hBrush);
        Ellipse(hdc, x, y, x + 50, y + 50);
        
        ReleaseDC(hWnd, hdc);
        DeleteObject(hBrush);
        break;
        
    case WM_KEYDOWN:
    case WM_LBUTTONDOWN:
    case WM_MBUTTONDOWN:
    case WM_RBUTTONDOWN:
    case WM_MOUSEMOVE:
        PostMessage(hWnd, WM_CLOSE, 0, 0);
        break;
        
    case WM_DESTROY:
        KillTimer(hWnd, TIMER_ID);
        PostQuitMessage(0);
        break;
        
    default:
        return DefScreenSaverProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

主函数

复制代码
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 解析命令行参数
    if (__argc == 2 && lstrcmpi(__argv[1], _T("/s")) == 0)
    {
        g_bSaverMode = true;
    }
    else if (__argc == 2 && lstrcmpi(__argv[1], _T("/p")) == 0)
    {
        // 预览模式处理
        return 0;
    }
    else if (__argc == 2 && lstrcmpi(__argv[1], _T("/c")) == 0)
    {
        // 配置对话框处理
        return 0;
    }
    
    // 获取屏幕尺寸
    g_iWidth = GetSystemMetrics(SM_CXSCREEN);
    g_iHeight = GetSystemMetrics(SM_CYSCREEN);
    
    // 注册窗口类
    WNDCLASS wc = {0};
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = ScreenSaverProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.lpszClassName = _T("ScreenSaverClass");
    
    if (!RegisterClass(&wc))
        return 0;
    
    // 创建全屏窗口
    g_hWnd = CreateWindowEx(
        WS_EX_TOPMOST,
        _T("ScreenSaverClass"),
        _T("Simple Screen Saver"),
        WS_POPUP | WS_VISIBLE,
        0, 0, g_iWidth, g_iHeight,
        NULL, NULL, hInstance, NULL);
    
    if (!g_hWnd)
        return 0;
    
    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return (int)msg.wParam;
}

编译和安装说明

  1. 使用Visual Studio创建Win32项目
  2. 将代码复制到主源文件中
  3. 将输出文件扩展名改为.scr
  4. 编译生成的可执行文件复制到系统目录(如C:\Windows\System32)
  5. 通过控制面板的"屏幕保护程序"设置选择该程序

功能扩展建议

  1. 添加配置文件支持
  2. 实现更复杂的图形效果
  3. 添加多显示器支持
  4. 实现密码保护功能
  5. 添加配置对话框

这个基础实现展示了一个简单的屏幕保护程序,包含一个弹跳的红球动画。任何键盘或鼠标操作都会退出屏幕保护程序。可以根据需要扩展图形效果和功能。

相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲6 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导7 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan7 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子7 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化7 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251497 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說8 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
学习星球9 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode