gbcactus
驱动牛犊
驱动牛犊
  • 注册日期2002-12-13
  • 最后登录2005-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1295回复:2

请教windows启动屏保的机制?是在driver层实现的吗?

楼主#
更多 发布于:2003-06-10 11:56
我们都知道键盘和鼠标一段时间之内不动,windows会启动屏幕保护程序(如果打开了屏保设置的话),但windows是如何实现的呢?是windows定时检查有无键盘或鼠标输入?还是键盘或鼠标的输入会将某个计时器清零?这是在driver层实现的吗(如:键盘的filter driver)?我现在需要做一个midi键盘的驱动,可是无法屏蔽屏保,所以我想知道windows启动屏保的机制。

最新喜欢:

baoyibao99baoyib...
ququ
驱动小牛
驱动小牛
  • 注册日期2001-07-02
  • 最后登录2007-12-26
  • 粉丝0
  • 关注0
  • 积分342分
  • 威望35点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-10 16:31
推荐你一片文章看看,不知道对你有没有用处。注意其中不启动屏保的条件3。另外,如果你要作屏保,设置对话框中有32位控件,要在registerdialogclass中调用函数InitCommonControls。然后编写screensaverconfiguredialog。

Windows屏幕保护程序的设计

 

国防科技大学电子工程学院(410073) 滕伟

Windows本身自带的几个颇具特色的程序,颇为耐人寻味,屏幕保护程序就是其中一朵迷人的小花。当鼠标和键盘闲置一定时间后,Windows就会自行启动设置好的屏幕保护程序,这样既可以避免静态图像长时间发射电子束烧伤显像管荧光粉,又可以隐藏屏幕上的敏感资料不被他人随意看到,起到一举两得的作用。

屏幕保护程序可在Windows安装时从Microsoft提供的程序中选择安装,如星空模拟、飞行窗口、变幻线和大屏幕等,用户通过\"控制面板\"中的\"桌面\"来选择自己喜爱的屏幕保护程序,并且能够设置屏幕保护程序的启动时间以及测试视觉效果。屏幕保护程序是怎样编制而成的呢?本文将向您简单介绍如何生成一个有自己特色的屏幕保护程序并把它加入到Windows的屏幕保护程序库中,使用户通过控制面板来进行选择和控制。

屏幕保护程序设计的一般概念

屏幕保护程序是包含特殊变量声明、输出函数及资料定义的Windows应用程序。Micro soft公司提供的静态连接库SCRNSAVE.LIB中包含了WinMain函数和使屏幕保护程序启动的其他代码。编制一个屏幕保护程序,主要是编制屏幕保护程序的设置模块和视觉效果模块。

屏幕保护程序在Windows启动时自动装载或由用户在控制面板中激活测试时执行。W indows自动监视按键及鼠标闲置行为并在用户定制的时间后启动。当检测到如下情况时,Windows不启动屏幕保护程序:①当前激活程序不是Windows应用程序;②计算机教程(C omputer-Base Training)正在运行;③应用程序在对WM-SYSCOMMAND发送由标志符SC-SCRE ENSAVE定义的消息时,返回非零值。

当编制的屏幕保护程序启动时,SCRNSAVE.LIB创建一个全屏窗口,窗口类登录如下:

WNDCLASS wndclass;

Wndclass.hCursor=NULL

wndclass.hIcon=LoadIcon(hInst,MAKEIN-TATOM(ID-APP))

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName=\"WindowsScreenSaver-Class\";

wndclass.hInstance=hinst;

wndclass.style=CS-VREDRAW|CS-HREDRAW|CS-SAVEBITS|CS-DBLCLKS;

wndclass.lpfnWndProc=ScreenSaverProc;

wndclass.cbWndExtra=0;

wndclass.cbWndclassExtra=0;

WNDCLASS结构的10个域描述了默认窗口类的所有窗口特征,其意义这里不作详细解释。

编制的屏幕保护程序需要提供ScreenSaverProc回调函数的过程,资源定义文件需提供ID-APP标志符标识的图标,不过,这时定义的光标只是在屏幕保护程序作为一个独立程序运行时才有用。

屏幕保护程序的编写步骤

1.SCRNSAVE.H头文件中定义了SCRNSAVE.LIB中的函数原型,程序中应首先包含该头文件。

2.声明以下SCRNSAVE.LIB中的全局变量:

extern HINSTANCE hMainInstance;

extern HWND hMainWindow;

其中hMainInstance变量是所编写应用程序的实例句柄,而hMainWindow是屏幕保护窗口的句柄。

3.若屏幕保护程序需包含设置信息,设置信息保存在CONTROL.INI中由ids AppName字符串内容定义的那部分文档 中。

4.rc资源文件的修改:定义idsAppName字符串,id-sAppName字符串必须以如下格式包含屏幕保护程序的名称:\"ScreenSaver.描述名称\"。

例如:一个名称为\"变幻线\"的屏幕保护程序就要在.rc资源文件中加入如下内容:

STRINGTABLE PRELOAD

BEGIN

idsAppName \"Screen Saver变幻线\"

END

5.屏幕保护窗口传送消息的处理:

ScreenSaverProc回调函数过程用来接收和处理屏幕保护程序窗口的消息。

特别注意:

①ScreenSaverProc窗口过程需将未处理的消息传送给DefScreenSaverProc过程而不是普通Windows应用程序中的DefWindowProc过程;

②ScreenSaverProc回调函数要在.def文件EXPORTS部分输出。

6.提供设置选择:

你可以提供给用户一个设置屏幕保护程序视觉效果的接口,使用户能拥有一份随心所欲操作的成就感。

Windows是这样处理这一情况的:当用户在\"桌面\"中选择\"设置\"按钮时,Windows使用/ c或-c命令行启动屏幕保护程序,显示设置对话框;如果不想显示设置对话框,就要使用/s 或-s命令行;不使用命令行时,Win-dows以默认值/c启动屏幕保护程序,显示设置对话框。

当编制的屏幕保护程序要支持用户的设置时,程序需提供如下的回调函数及对话框资源:

ScreenSaverConfigure-Dialog\"设置对话框\"的对话框回调函数过程;

RegisterDialogClasses 登记\"设置对话框\"标准或非标准窗口类函数;

DLG-SCRNSAVECONFIGURE \"设置对话框\"的对话框资源模板。

当Windows以/c命令行启动编制的屏幕保护程序时,SCRNSAVE.LIB中WinMain过程自动调用 Reg-isterDialogClasses函数并显示\"设置对话框\"。

如果需要处理设置对话框,就要在程序中编写ScreenSaverConfigureDialog回调函数过程,编制的屏幕保护程序在控制面板的CONTROL.INI初始化文件中保存设置信息,该信息保存在STRINGTABLE中id-sAppName字符串内容定义的段中。程序可使用WritePrivateProfileSt ring函数和WritePrivateProfileInt函数来保存设置信息,用LoadString函数恢复保存在CO NTROL.INI中的设置信息。

RegisterDialogClasses中的hInst参数包含所编制程序的实例句柄,亦即全局变量hM ainInstance。如果设置对话框回调函数过程不含任何特殊的窗口类,Reg-isterDialogCl asses函数只简单地返回TRUE就行了。

7.模块定义文件的修改:

①切记输出ScreenSaverProc函数!若通过\"设置对话框\"为用户提供了程序行为设置接口,就需要输出ScreenSaverConfigureDialog函数。RegisterDialog-Classes函数则不必输出; ②模块定义文件中的DISCRIPTION部分格式如下:

DESCRIPTION‘SCRNSAVE:(你想在\"控制面板\"中显示的屏幕保护程序名称)’ 屏幕保护程序的安装

\"控制面板\"启动时,会在Windows的启动目录中自动搜索后缀为.SCR的文件作为屏幕保护程序(屏幕保护程序都是符合上述条件的普通Windows可执行程序,只是简单地将其后缀改为.SCR即可),所以编译连接后,将生成的.EXE文件改为.SC R后缀文件,并将之拷至Win-dows启动目录下,即可在\"控制面板\"的\"桌面\"中发现你的应用程序进行测试和设置了。


gbcactus
驱动牛犊
驱动牛犊
  • 注册日期2002-12-13
  • 最后登录2005-11-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-11 00:07
\"应用程序在对WM-SYSCOMMAND发送由标志符SC-SCREENSAVE定义的消息时,返回非零值。\"---我刚刚用它截获了SC-SCREENSAVE消息,多谢了。
游客

返回顶部