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

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

相关推荐
h39744 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
夏幻灵5 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码5 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客6 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx7 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆7 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光7 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园7 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西8 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨8 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言