使用SDK编写屏幕保护程序
2009-05-02 19:17
435 查看
屏幕保护程序win32 API支持的一种特殊的应用程序,由系统自动激活。其机制是当激活条件满足时,系统向当前活动窗口发送wParam值为SC_SCREENSAVE的WM_SYSCOMMAND消息,然后由当前窗口执行指定的屏幕保护程序。
如果某些程序在运行过程中不愿意然屏保打断,需要截获wParam值为SC_SCREENSAVE的WM_SYSCOMMAND消息,并不传递到DefWindowProc中。
静态链接库SCRNSAVE.LIB对屏幕保护程序提供了支持。
SCRNSAVE.LIB包含了建立屏幕保护程序的主程序。屏幕保护程序启动时,SCRNSAVE.LIB自动创建一全屏窗口,并描述窗口类为无光标的满黑屏。
用户编写的屏幕保护程序必须包含三个基本函数ScreenSaverProc,ScreenSaverConfigureDialog 和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_APP。ID_APP由系统的SCRNSAVE.H.定义。
资源文件中必须包含一描述字符串。该字符串用于控制面板显示屏幕保护程序的名字。它必须位于字符串表的首位。SCRNSAVE.H.定义其ID为1。
资源文件中屏幕保护程序配置对话框的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;
}
如果某些程序在运行过程中不愿意然屏保打断,需要截获wParam值为SC_SCREENSAVE的WM_SYSCOMMAND消息,并不传递到DefWindowProc中。
静态链接库SCRNSAVE.LIB对屏幕保护程序提供了支持。
SCRNSAVE.LIB包含了建立屏幕保护程序的主程序。屏幕保护程序启动时,SCRNSAVE.LIB自动创建一全屏窗口,并描述窗口类为无光标的满黑屏。
用户编写的屏幕保护程序必须包含三个基本函数ScreenSaverProc,ScreenSaverConfigureDialog 和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_APP。ID_APP由系统的SCRNSAVE.H.定义。
资源文件中必须包含一描述字符串。该字符串用于控制面板显示屏幕保护程序的名字。它必须位于字符串表的首位。SCRNSAVE.H.定义其ID为1。
资源文件中屏幕保护程序配置对话框的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;
}
相关文章推荐
- 用vbs实现配置无人登录计算机时使用的屏幕保护程序
- 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护
- [转]用汇编编写屏幕保护程序
- 使用C#开发屏幕保护程序步骤
- 用汇编编写屏幕保护程序
- 用Visual C#编写屏幕保护程序
- 一个使用Win32SDK编写Windows GUI程序的教程: "theForger's Win32 API Tutorial"
- 用Visual C#编写屏幕保护程序
- 使用IDEA编写Python程序,插件安装python插件,安装python SDK运行Python程序
- 使用Python 启动windows 屏幕保护程序 及在线程中启动
- 屏幕保护程序的编写
- Win7系统在使用改进电源使用时提示屏幕保护程序已启用问题
- 使用java编写控制台程序,在屏幕上打印出“陈”字
- 使用Delphi,SDK编写Windows简单程序
- 利用VB编写屏幕保护程序
- “屏幕保护程序”没有出现“在恢复时使用密码保护”的解决方法
- 为Delphi编写的屏幕保护程序增加描述
- 用Visual C#编写屏幕保护程序
- 内核态下基于动态感染技术的应用程序执行保护(二 使用汇编语言编写内核态程序)
- 用C#Builder编写屏幕保护程序