c#制作屏幕保护程序步骤(字幕屏保)
屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件。但他又是一个比较独特的"exe"文件。下面就来探讨一下,用c#是如何编写屏幕保护的整个过程。
二.c#编写字幕显示屏保程序的关键步骤以及解决方法:
(1)设定程序的窗体符合屏幕保护的要求:
由于屏幕保护程序就是一个可执行程序,所以在编写屏幕保护程序的时候,首先按照可执行程序来设计。但屏幕保护有自身的特点。譬如:屏幕保护都是充满
整个屏幕的,并且没有无边。屏幕保护运行的时候,不能显示任务栏。在程序设计中实现这些特点,关键就在于对窗体的某些属性的设定上。下面是对窗体属性的
设定,就可以满足屏幕保护的要求,具体如下:
this.name = "screensaver" ;
//窗体运行后无边界
this.formborderstyle = formborderstyle.none ;
//程序运行后不显示在任务栏上
this.showintaskbar = false ;
//窗体运行后,最大化,充满整个屏幕
(2)使得字符在屏幕上不断移动:
实现字符在屏幕上像字符屏保一样不断移动,是通过一个定时器来完成的。不断移动的字符,其实就是一个label组件。当设定好label组件要显示的字符后,
也就设定了在屏幕上要移动的字符。定时器每隔一段时间,都把label组件的横坐标减去一个定值,这样在定时器的驱动下,label组件的位置就变换了,带来的视
觉效果,就是字符不断移动。
当label组件的位置已经移动到屏幕的外面以后,这是就有把label组件的横坐标回复到起始值(即:屏幕的最右边),然后判断label组件的纵坐标是否位于屏
幕的顶部,如果在顶部,则把纵坐标的位置重置在中部;如果在中部,则重置在底部;如果在底部,则重置在顶部。经过了这些判断,字符不仅可以实现从右往左
移动,还可以变换字符进入屏幕的位置。从而也丰富了屏幕保护的内容。其实要实现这些判断,首先还必须知道屏幕的工作区域,因为只有先知道屏幕的工作区域
,在能够实现对label组件的横坐标和纵坐标的设定工作。下面就是实现此步骤地具体代码:
//得到计算机屏幕的工作区域
rectangle ssworkarea = screen.getworkingarea ( this ) ;
lblmarquee.location = new point ( ssworkarea.width - idistance ,
lblmarquee.location.y ) ;
//显示标签
lblmarquee.visible = true ;
// 增加2个象素点,你可以通过修改speed的值来改变标签的移动速度
idistance += speed ;
// 如果标签已经走出屏幕,则把标签的位置重定位到屏幕的右边
if ( lblmarquee.location.x <= -( lblmarquee.width ) )
{
//reset the distance to 0.
idistance = 0 ;
//判断标签的位置是否在顶部,如果在,则重定位到中部
if ( lblmarquee.location.y == 0)
lblmarquee.location = new point ( lblmarquee.location.x , ( ssworkarea.height / 2 ) ) ;
//判断标签的位置是否在中部,如果在,则重定位到底部
else if ( lblmarquee.location.y == ssworkarea.height / 2 )
lblmarquee.location = new point ( lblmarquee.location.x , ssworkarea.height - lblmarquee.height ) ;
//重定位到顶部
else
lblmarquee.location = new point ( lblmarquee.location.x , 0 ) ;
}
(3)检测键盘、鼠标状态,确定退出屏幕保护程序:
在屏幕保护运行的时候,当键盘被按动,或者鼠标移动,屏幕保护都会关闭。在实际的程序设计中,检测键盘是否被按动,通过"keydown"事件就可以判断。在
程序中,判断鼠标是否移动的思路是通过二个全局变量记录下,程序刚刚运行的时候的鼠标的位置(即:x和y),当鼠标移动的时候,判断移动后的位置和记录的
位置是否有出入,如果有出入,就关闭屏保。下面代码功能就是检测鼠标移动,并结束屏幕保护,具体如下:
// 把鼠标刚刚开始移动的位置给记录下来
if ( ixstart == 0 && iystart == 0 )
{
ixstart = e.x ;
iystart = e.y ;
return ;
}
//判断自屏幕保护程序运行后,鼠标的位置是否变动
else if ( e.x != ixstart || e.y != iystart )
{
cursor .show ( ) ;
timersaver.enabled = false ;
application .exit ( ) ;
};
其中"ixstar"和"iystart"就是记录程序运行的时候,鼠标的起始位置。
(4).对windows对屏幕保护设定参数的响应:
当屏幕保护加入到windows系统后,你就可以通过windows系统来设定屏幕保护的属性了,由于我们制作的这个屏幕保护,没有可供设置的选项,但也要对
windows的"设置"按钮进行响应。而要完成这种响应,所用的知识就是在windows系统中按动"设置"按钮,对屏幕保护进行设定时,其实也就对屏保程序传递"/c"字
符。而要设定口令,则会传递"/a"字符,据此,可以得到代码:
if (args [ 0 ].substring ( 0 , 2 ).equals ( "/c" ) )
{
messagebox.show("此屏幕保护没有可供设置的选项!","用c#制造屏幕保护" ,
messageboxbuttons.ok ,messageboxicon.information ) ;
application.exit ( ) ;
}
else if ( args [ 0 ] == "/a" )
{
messagebox.show("此屏幕保护没有可供设定口令的选项!","用c#制造屏幕保护" ,
messageboxbuttons.ok ,messageboxicon.information ) ;
application.exit ( ) ;
}
三.总结:
由于屏幕保护都是windows程序,所以编译的时候,要产生windows程序,编译的命令如下:
csc /t:winexe screen.cs
在正确编译"screen.cs"后,可以得到"screen.exe"文件,把"screen.exe"改名为"screen.scr",并拷贝到windows的"system32"目录中去。至此这个字符屏保
就完成了从编写到配置的全部工作了。