用汇编编写屏幕保护程序

使用 WPF 开发一个 Windows 屏幕保护程序 最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面。我想了想,屏幕保护程序可以到这一点,而且,屏幕保护程序的开发也是非常简单的。 本文将介绍如何为 Windows 这一悠久的功能进行开发。 本文内容屏幕保护程序的本质安装屏幕保护程序处理屏幕保护程序参数请预防一些坑参考资料 屏幕保护程序的本质 屏幕保护程序本质上就是一个 Win32 窗口应用程序。 好了,这一... 阅读详情

用汇编编写屏幕保护程序 
作者:罗云彬·发布日期:2000-8-8·阅读次数:12107
 

--------------------------------------------------------------------------------
   屏幕保护程序是什么,相信大家都用过,但对于它的结构也许就不那么熟悉了。屏幕保护程序是一种特使的 .exe 文件,实际上它是一个标准的 PE 文件,除了有扩展名 .scr,当然这个扩展名也是用连接程序产生的 .exe 文件改名得到的。但在编程中,屏幕保护程序又有它的特殊的地方,说穿了就是它的编程规范。

   屏幕保护程序有以下特点:

1.屏幕保护程序是Win32 API 支持一种特殊的应用程序并由系统自动激活。其机制是当条件满足时,系统向当前活动窗口发出字参数 wParam 值为 SC_SCREENSAVE 的 WM_SYSCOMMAND 消息,然后由当前活动窗口执行 SYSTEM.INI 文件中 [boot] 区指定的屏幕保护程序。
2.屏幕保护程序激活的条件是:在规定时间内没有鼠标或键盘输入、当前的活动窗口是标准的 WINDOWS 应用程序。因为非 WINDOWS 应用,不会理睬 WM_SYSCOMMAND 消息。显然,如果当前活动的程序接管了字参数 wParam 值为 SC_SCREENSAVE 的 WM_SYSCOMMAND 消息并且不传递到 DefWindowProc 函数就可以禁止屏幕保护程序。这对某些运行中不愿意被打断的程序如视频播放,光盘刻录程序特别有用。
3.可以在控制面板的显示器中选择需要的屏幕保护程序,并可以配置屏幕保护程序的参数。配置的对话框由屏幕保护程序提供。

   下面是编写屏幕保护程序的要点:

   屏幕保护程序的编写由静态链接库 SCRNSAVE.LIB 支持,它包含了建立屏幕保护程序的主程序和缺省功能,如建立一个缺省的大小为全屏幕的窗口供用户使用,并提供缺省的消息处理程序,它对下面消息的缺省处理是:

WM_SETCURSOR -- 将光标设置为无
WM_PAINT -- 画屏幕背景
WM_LBUTTONDOWN、WM_MBUTTONDOWN、WM_RBUTTONDOWN、WM_KEYDOWN、WM_MOUSEMOVE -- 终止执行
WM_ACTIVATE -- 如果 wParam 是 FALSE,则终止执行


   程序的入口代码已经包括在 scrnsave.lib 中,名称为 WinMain,所以程序尾包括 end WinMain 即可。
   用户只需编写三个基本函数必须名为 ScreenSaverConfigureDialog、ScreenSaverProc 和 RegisterDialogClasses,这 3 个函数必须在.DEF 文件中指定 export

1.ScreenSaverProc - 主过程,也就是自动建立的主窗口的窗口过程,所有对屏幕的处理就是由它完成的。可以把未处理的消息传递到 DefScreenSaverProc函数,由系统处理上面说到的缺省处理。缺省 DefScreenSaverProc 过程处理 WM_LBUTTONDOWN、WM_MBUTTONDOWN ; WM_RBUTTONDOWN、WM_KEYDOWN、WM_MOUSEMOVE 消息并结束程序,如果在这些消息时不想退出,可以自行处理,不要传递到 DefScreenSaverProc。

2.ScreenSaverConfigureDialog - 处理屏幕保护程序配置对话框过程,这个过程并不是由主程序调用的,而是由控制面板的显示器设置程序调用。用户输入的配置数据应该输出到.INI 或注册表中。

3.RegisterDialogClasses - 登记屏幕保护程序配置对话框的窗口类,如果使用标准的对话框,可以简单地返回 TRUE。


   在 ScreenSaverProc 窗口过程中,有个专用消息 WM_ERASEBKGND -- 可以在这时擦除背景,如果把这个消息传到 DefScreenSaverProc,会得到一个全黑的背景。

   使用时必须将编译完成的 .exe 文件改名为 .scr 文件,然后拷贝到 Windows 或 Windows/System 目录下。
   为使控制面板能够识别,屏幕保护程序的图标(ICON)在资源文件中必须定义为 100,资源文件中必须包含一描述字符串。该字符串用于控制面板显示屏幕保护程序的名字。它必须位于字符串表的首位,ID 为 100。资源文件中屏幕保护程序配置对话框的 ID 必须为2003。
   综上所述,屏幕保护程序的两个部分即窗口过程和设置对话框过程是在不同的地方被执行的,所以在编程中要注意不要在两个过程中传递变量,这就意味着屏幕保护程序的设置要被输出到 .ini 或注册表中保存,在窗口过程中的 WM_CREATE 消息中再读入,因为你无法把它保留在内存中。同样窗口过程和设置对话框过程中的变量或资源的初始化也要分别进行,比如说两者都要用到同一个图片,那就在自己的 WM_CREATE 消息中分别 LoadBitmap,总之要时刻认为你是在编写两个“独立的程序”。

   下面是一个屏幕保护程序的资源定义例子:

#include 

#define ICO_MAIN  100
#define DLG_SETUP  2003

ICO_MAIN ICON  "Resource/Main.ico"

DLG_SETUP DIALOG DISCARDABLE  0, 0, 300, 120
STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION  "屏幕保护程序"
FONT  9, "宋体"
BEGIN
    ...
    ...
    DEFPUSHBUTTON   "确定(&O)",  IDOK,  240,10,50,14
    PUSHBUTTON      "取消(&C)",  IDCANCEL, 240,29,50,14
END

STRINGTABLE DISCARDABLE
BEGIN
 100 "保护程序"
END
.def 文件例子:

EXPORTS
ScreenSaverProc
ScreenSaverConfigureDialog
RegisterDialogClasses

源代码例子:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 版本信息
; 屏幕保护程序模板
; Ver 1.0 - 2000.07.15
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  .386
  .model flat, stdcall
  option casemap :none   ; case sensitive

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include  windows.inc
include  user32.inc
include  kernel32.inc
include  comctl32.inc
include  comdlg32.inc
include  gdi32.inc
include  advapi32.inc
include  shell32.inc
include  scrnsave.inc

includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib gdi32.lib
includelib advapi32.lib
includelib shell32.lib
includelib scrnsave.lib
includelib msvcrt.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ  100 ;Must be 100
DLG_SETUP equ  2003 ;Must be 2003

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  .data?

hInstance dd  ?
hWinMain dd  ?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  .code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 设置对话框过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ScreenSaverConfigureDialog proc uses ebx edi esi, /
  hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

  mov eax,wMsg
;********************************************************************
  .elseif eax == WM_CLOSE
   invoke EndDialog,hWnd,NULL
;********************************************************************
  .elseif eax == WM_COMMAND
   mov eax,wParam
   .if eax == IDOK
                ...                在此保存设置                ...
    invoke EndDialog,hWnd,NULL
   .elseif eax == IDCANCEL
    invoke EndDialog,hWnd,NULL
   .endif
  .else
   mov eax,FALSE
   ret
  .endif
  mov eax,TRUE
  ret

ScreenSaverConfigureDialog endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主程序窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ScreenSaverProc proc uses ebx edi esi, /
  hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

  mov eax,uMsg
  .if eax == WM_CREATE
      invoke GetModuleHandle,NULL
   mov hInstance,eax
   mov eax,hWnd
   mov hWinMain,eax            ...
            在此初始化,包括定义一个定时器            ...
      invoke SetTimer,hWinMain,TIMER_MOON,100,NULL
  .elseif eax == WM_DESTROY
   call _Quit
;********************************************************************
  .elseif eax == WM_TIMER
            ...
            在此画屏幕动画            ...
   xor eax,eax
   ret
;********************************************************************
;  .elseif eax == WM_ERASEBKGND
;********************************************************************
; 以下黑屏的代码在 DefScreenSaverProc 中已经包括,如果自己要处理
; 屏幕,可以把它去掉。
;********************************************************************
;   invoke GetDC,hWnd
;   mov @hDc,eax
;   invoke GetClientRect,hWnd,addr @stRc
;   invoke GetStockObject,BLACK_BRUSH
;   invoke FillRect,@hDc,addr @stRc,eax
;   invoke ReleaseDC,hWnd,@hDc
;   xor eax,eax
;   ret
  .endif
;********************************************************************
  invoke DefScreenSaverProc,hWnd,uMsg,wParam,lParam
  ret

ScreenSaverProc endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 注册设置对话框窗口Class过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RegisterDialogClasses proc uses ebx edi esi, hInst:DWORD

  mov eax,TRUE
  ret

RegisterDialogClasses endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  end WinMain


   以上是一个屏幕保护程序的框架结构,其实编写一个屏幕保护程序的大部分工作量在于 WM_TIMER 消息的处理,也就是说对动画的处理,如果就把上面的程序编译,那么你就会得到一个最简单的“黑屏”屏保。 

C#屏幕保护程序设计实践指南 本文还有配套的精品资源,点击获取 简介:本指南探讨了使用C#编程语言开发屏幕保护程序的各个关键环节。首先介绍了C#编程语言的基础知识,然后深入讲解了Windows Forms应用开发、屏幕信息获取、定时器使用、应用程序生命周期管理、图形设计与动画制作,以及屏幕保护程序的安装配置和事件处理等内容。通过本指南,开发者可以学会如何设计并实现一个适应多种屏幕尺寸、具有动画效果,并能... 阅读详情

相关推荐

汇编语言编写的屏保程序

文档里有一个简单的屏保程序,可直接在dos下运行,是我小学期得。

C# 屏幕保护程序制作

(1)创建新项目 建好长这样,VS2022是这样,其他版本应该差距不大 如果右下角没有属性栏,右键Form1,属性就会出来 (2)先对窗口一下预处理,屏保肯定是没有边框的,所以要去掉它的边框样式 选择外观下的FormorderStyle,属性设置为None; 效果 (3)设置大小最大化,你总不能让他只保护你的一半吧,你的另一半难道不重要吗? 代码后面会说 (4)打开工具栏,我们双击或者把它拉到form1上添加一个Label1 (5)在la...

yuwoxinanA3的博客 5172

汇编语言写的DOS界面下的屏幕保护程序

汇编语言写的DOS界面下的屏幕保护程序,如果5秒种没有键盘输入就自动进入屏保,按任意键退出屏保

屏幕保护程序编写

对于屏幕保护程序,大家应该不会陌生。屏幕保护程序的后缀名是.scr,其实它就是一个可执行的.exe文件。  VC提供了一个支持屏幕保护的开发库scrnsave.lib,这个库已经定制了一个屏幕保护程序的框架结构,开发者只需要在完成相应的函数和提供相应的资源就可以写出自己的屏幕保护程序。  讲到这里,我想你对屏幕保护程序到底是什么东东应该有了一个比较清楚的认识了吧!  在VC中,要完成一个屏幕保护程...

weixin_34007879的博客 491

[转]用汇编编写屏幕保护程序

  屏幕保护程序是什么,相信大家都用过,但对于它的结构也许就不那么熟悉了。屏幕保护程序是一种特使的 .exe 文件,实际上它是一个标准的 PE 文件,除了有扩展名 .scr,当然这个扩展名也是用连接程序产生的 .exe 文件改名得到的。但在编程中,屏幕保护程序又有它的特殊的地方,说穿了就是它的编程规范。屏幕保护程序有以下特点:屏幕保护程序是Win32 API 支持一种特殊的应用程序并由系统自动激活

hoverlees的专栏 746

汇编语言全接触-73.用汇编编写屏幕保护程序

在 Dos 汇编中,psp 段的 0080H 开始的位置就是命令行参数,在 Win32汇编中,我们获得命令行参数的方法是使用 Api - GetCommandLine,它没有输入参数,返回的是指向命令行的指针,返回的字符串中,包含执行文件的文件名。szCaption db '命令行参数测试',0。

qq_41237850的博客 457

80x86汇编屏保程序_旋转五星

;  80x86汇编屏保程序_旋转五星   CODE  SEGMENT    ASSUME    CS:CODE,DS:CODE  .386P  org 100h   START:    PUSH      CS    POP       DS    push cs    pop es    cld    MOV       DI,1000H    MOV       CX,360 @cs

dididu1515的专栏 6550

实验10 编写程序

本文介绍了基于王爽《汇编语言》的实验内容,包含三个子程序实现: 字符串显示子程序show_str:在指定屏幕位置(8行3列)显示黑底绿字字符串"Welcome to masm!",通过计算显存偏移地址实现定位。 32位除法子程序divdw:实现了1000000÷10的运算,采用分段除法策略避免溢出,结果正确返回商100000和余数0。 数字转字符串子程序dtoc:将12666转换为ASCII字符串并显示,通过除10取余法获取各位数字,存入显存后呈现为绿色文本。 实验完整代码已开源至码云,

2503_91038749的博客 989

80x86汇编屏保程序

80x86汇编屏保程序运行效果:    显示旋转的三角形,并间隔清屏。          将虚线内代码,用记事本以ANSI格式,保存为sjx.bat,双击运行,按 Esc 程序退出。-----------------------------------------------------goto sjxE100  0E 1F 0E 07 FC BF 00 10 B9 68 01 FF 06

dididu1515的专栏 622

怎么用C语言讲小程序复制到开机启动文件夹,另存于本文件夹自己动手编写一个简单的操作系统(编写操作系统开始是对BIOS控制取出存储在ROM里的程序 完成以后BIOS就会选择一个启动设备并读取该设备的第一...

有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,对C语言也一知半解,能写操作系统吗?答案是没问题。我将带大家一步一步完成自己的操作系统。当然如果学一学上述内容再好不过。首先要明确处理器(也就是CPU)控制着计算机。对PC而言,启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能是8086级...

weixin_30673943的博客 323

2年修完6个清华CS硕士学位第3周反思报告

郑重计划通告: 故事终传奇故事终传奇故事终传奇故事终传奇故事终传奇故事终传奇故事终传奇 七天学完北大离散数学课程:第一天1. 计划概览2. 今日学习成果3. 今日时间表3. 今日反思3. 明日学习目标5. 相关资料5.1. 起床打卡图片5.2. 今日时间统计5.3. 每日学习总结视频-B站链接5.4. 每日思维导图内容截图5.5 ==每日评分依据截图==七天学完北大离散数学课程:第一天) 1. 计...

彪悍的人生不需要解释! 841

告别GRUB!gh_mirrors/os/os-tutorial-cn教程:从零编写启动代码,打造属于你的迷你操作系统

你是否曾经好奇计算机启动时究竟发生了什么?想要摆脱GRUB等现成引导程序的束缚,亲手打造一个从开机到运行的完整流程?gh_mirrors/os/os-tutorial-cn项目提供了从零开始编写操作系统的中文教程,让你通过实践掌握操作系统的核心原理,从零编写启动代码,打造属于自己的迷你操作系统。 ## 🚀 为什么要学习从零编写操作系统? 学习操作系统开发不仅能深入理解计算机底层工作原理,还能

gitblog_00647的博客 227

动手写一个现代化的操作系统

操作系统 前言 本篇博客是基于彭东的操作系统实战45讲的内容的学习笔记,目的在于总结和排坑 专栏链接:https://time.geekbang.org/column/intro/411 环境是运行在VM上的Ubuntu20 一.程序的运行过程:从代码到机器运行 #include "stdio.h" int main(int argc, char const *argv[]) { printf("Hello World!\n"); return 0; } 这段代码是每个学习C语言人的第一行代

Destiny_159的博客 2729

Windows屏幕保护程序的制作

                                                              Windows屏幕保护程序的制作前些日子看了阿卓工作室的一篇关于如何制作屏保程序的文章及其示例,我便想自己一个玩玩,所以按他说的,结果不行,所以就在MSDN中搜索了下,得到这么一篇文章,翻译备份如下,以后要用得时候看:                     

Alex的学习之路 7295

使用Win32 SDK开发屏幕保护程序

暮鼓集    行走集 1.引言 屏幕保护程序(Screen Saver)的历史几乎与视窗操作系统的历史一样悠久,设计它的目的是为了保护CRT显示器使其的使用寿命更长。但随着技术的进步,新型的CRT显示器及液晶显示器已经无须这样了,不过屏幕保护程序并未消失,因为其绚丽的画面成了人们彰显个性的方式。 现在,逼真的水族箱,浩瀚的太空以及更吸引眼球的屏幕保护程序不段被开发出来。 如果你有兴趣...

暮鼓集 2531

利用Delphi编写屏幕保护程序

---- 实际上Windows屏幕保护程序也是一个可执行文件,只不过扩展名是 .SCR而不是.EXE。但是它也应满足一定的要求,以便提供给控制面板合适的接口。使得用户可以在显示器的“属性”中选择和配置它。通常它应满足以下要求: ---- 1、包含有关于自己的设置; ---- 2、提供关于自己的描述; ---- 3、能够区分是激活状态还是配置状态; ---- 4、不允许自己的拷贝同时运...

weixin_34376986的博客 327
上一篇: 德意上演经典大站
下一篇: 用汇编写个最小的WDM驱动程序进RING0
Simbao
博客等级 码龄24年 13粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值