使用SDK编写屏幕保护程序

来源:互联网 发布:印度 阵风 知乎 编辑:程序博客网 时间:2024/05/16 14:49
 
屏幕保护程序win32 API支持的一种特殊的应用程序,由系统自动激活。其机制是当激活条件满足时,系统向当前活动窗口发送wParam值为SC_SCREENSAVE的WM_SYSCOMMAND消息,然后由当前窗口执行指定的屏幕保护程序。
 
如果某些程序在运行过程中不愿意然屏保打断,需要截获wParam值为SC_SCREENSAVE的WM_SYSCOMMAND消息,并不传递到DefWindowProc中。
 
静态链接库SCRNSAVE.LIB对屏幕保护程序提供了支持。
SCRNSAVE.LIB包含了建立屏幕保护程序的主程序。屏幕保护程序启动时,SCRNSAVE.LIB自动创建一全屏窗口,并描述窗口类为无光标的满黑屏。
 
用户编写的屏幕保护程序必须包含三个基本函数ScreenSaverProcScreenSaverConfigureDialog RegisterDialogClasses 并与SCRNSAVE.LIB连接。

1
ScreenSaverProc 窗口函数处理特定的消息并把未处理的消息传递给SCRNSAVE.LIB ScreenSaverProc 一般处理以下消息:


WM_CREATE
读取.INI或注册表的初始化数据,设置定时器以及其他初始化操作。


WM_ERASEBKGND
擦除背景为下一步绘图作准备。


WM_TIMER
进行绘图输出。用户可以实现自己的动画功能以及其他操作。


WM_DESTROY
删除定时器以及其他对象


ScreenSaverProc
把未处理的消息传递到SCRNSAVE.LIB中的 DefScreenSaverProc函数处理。由它完成许多复杂和关键的操作比如何时激活,何时关闭等,大大方便了屏幕保护程序的编写。


2
ScreenSaverConfigureDialog函数处理屏幕保护程序配置对话框。该对话框由控制面板的显示器设置程序调用。用户输入的配置数据输出到.INI或注册表中。


3. RegisterDialogClasses
函数登记屏幕保护程序配置对话框的窗口类。如果不使用特殊的窗口或控件,可以简单地返回TRUE


另外,编写屏幕保护程序还有一些原则。


为使控制面板能够识别,屏幕保护程序的扩展名必须改为.SCR并存放在WINDOWS目录下。


屏幕保护程序的图标(ICON)在资源文件中必须定义为ID_APPID_APP由系统的SCRNSAVE.H.定义。


资源文件中必须包含一描述字符串。该字符串用于控制面板显示屏幕保护程序的名字。它必须位于字符串表的首位。SCRNSAVE.H.定义其ID1


资源文件中屏幕保护程序配置对话框的ID必须为DLG_SCRNSAVECONFIGURE。它由系统的SCRNSAVE.H.定义。
 
程序如下:
#include <windows.h>
#pragma comment(lib, "scrnsave.lib")
#include "resource.h"
#include <scrnsave.h>
//声明三个基本的函数
LRESULT WINAPI ScreenSaverProc (HWND,UINT,WPARAM,LPARAM);
 
BOOL WINAPI ScreenSaveConfigureDialog (HWND,UINT,WPARAM,LPARAM);
BOOL WINAPI RegisterDialogClasses(HANDLE);
//定义三个基本的函数
LRESULT WINAPI ScreenSaverProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 static UINT timer;
 HDC hDC;
 POINT p1,p2;
 HPEN hPen,hOldPen;
 switch(msg)
 {
 case WM_CREATE:
  timer = SetTimer (hwnd, 1, 1000, NULL);
  break;
 case WM_TIMER:
  //绘图
  hDC = GetDC (hwnd);
  p1.x = rand() % GetSystemMetrics(SM_CXSCREEN);
  p1.y = rand() % GetSystemMetrics(SM_CYSCREEN);
  p2.x = rand() % GetSystemMetrics(SM_CXSCREEN);
  p2.y = rand() % GetSystemMetrics(SM_CYSCREEN);
  hPen = CreatePen(PS_SOLID,5,RGB(rand()%255,rand()%255,rand()%255));
  hOldPen = (HPEN)SelectObject(hDC,hPen);
  MoveToEx(hDC, p1.x, p1.y, NULL);
  LineTo(hDC, p2.x, p2.y);
  SelectObject(hDC, hOldPen);
  DeleteObject(hPen);
  ReleaseDC(hwnd,hDC);
  break;
 case WM_DESTROY:
  KillTimer(hwnd,1);
  PostQuitMessage(0);
  break;
 }
 return DefScreenSaverProc(hwnd, msg, wParam, lParam);
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
 //一般不需要,仅返回true
 return TRUE;
}
BOOL WINAPI ScreenSaverConfigureDialog (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 //编写配置对话框
 //这里没实现配置对话框,仅返回false
 return FALSE;
}
原创粉丝点击