用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. 添加配置对话框

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

相关推荐
tumu_C3 小时前
无用知识研究:在trailing return type利用decltype,comma operator在对函数进行sfinae原创 [二]
开发语言·c++·算法
jjjxxxhhh1233 小时前
【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析
开发语言·qt·交互
web安全工具库3 小时前
告别刀耕火种:用 Makefile 自动化 C 语言项目编译
linux·运维·c语言·开发语言·数据库·算法·自动化
红糖生姜4 小时前
P12874 [蓝桥杯 2025 国 Python A] 巡逻||题解||图论
c++·蓝桥杯·图论
小小测试开发4 小时前
Python Arrow库:告别datetime繁琐,优雅处理时间与时区
开发语言·前端·python
鸽鸽程序猿4 小时前
【项目】【抽奖系统】注册功能实现
java·开发语言
云泽8084 小时前
C/C++内存管理详解:从基础原理到自定义内存池原理
java·c语言·c++
weixin_307779134 小时前
在Linux服务器上使用Jenkins和Poetry实现Python项目自动化
linux·开发语言·python·自动化·jenkins
润 下4 小时前
C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
c语言·开发语言·人工智能·经验分享·笔记·程序人生·其他