屏保程序为什么越运行越多????(100分)

  • 主题发起人 主题发起人 sunnyliu
  • 开始时间 开始时间
S

sunnyliu

Unregistered / Unconfirmed
GUEST, unregistred user!
我编了一个屏保程序,编译运行时都没有问题,但是将文件后缀改为scr
并放到windows目录下设成当前屏保, 屏保激发后,会隔几秒运行一次,
隔几秒运行一次,越运行越多,这是为什么???
 
如果你不改名呢?
参考一下Delphi 深度历险
 
不改名??如何在屏保文件列表中看到它??
 
你要在程序起动时加入判断,如果此时已经运行了该程序的话就退出
因为系统不断地会调用屏保,所以你的程序就越来越多了
 
但是直接运行exe文件就没有问题,而且许多范例并没有提到需要判断是否已有exe在运行
 
"屏保激发后,会隔几秒运行一次,
隔几秒运行一次,越运行越多"
大家注意一下这个。我觉得不只是程序是否二次运行的问题。先看看源程序,怎么会不断地
运行的呢?如果确定源程序没有重复调用本程序运行,一个可能是WINDOWS的问题,试试看
通过CREATEMUTEX来避免程序的多次运行(大富翁中已有很多例程,自己找找吧)^_^
 
我写过屏保程序,肯定是这个原因!
 
ScreenSaver的启动过程:
1。Windows通过向当前激活窗口发出启动ScreenSaver的消息
2。当前window如果允许运行ScreenSaver,便把消息交给DefWindowProc处理
3。DefWindowProc如果收到这个消息,便会启动ScreenSaver
4。Windows会不断发出启动ScreenSaver的消息,直到:
某个active的window处理了这个消息

所以,你的问题就是要在程序了处理启动ScreenSaver的消息
 
刚刚看了一下MSDN,下面就是解决方法:
A screen saver application's ScreenSaverProc window procedure should use
DefScreenSaverProc instead of the DefWindowProc function to provide
default message processing.
其实原因在DefScreenSaverProc的解释里,摘下:
WM_SYSCOMMAND
Returns FALSE if the wParam parameter of WM_SYSCOMMAND is either
SC_CLOSE or SC_SCREENSAVE.
 
我以前做屏保的时候也遇到这个问题,只要跟普通程序防止二次运行用相同的方法就可以了
 
请把屏幕保护程序代码发过来我研究一下.xieyj@esquel.com
 
在你的程序开头的部分(DPR)使用互斥对象判断一下是否运行了该程序的一个实例就可以了,
否则系统不断向屏保程序发送带/S 的命令来启动,所以会越来越多.
还有一个办法是告诉系统已经运行了屏保程序,使用函数原形如下:
The SystemParametersInfo function queries or sets systemwide parameters. This function can also update the user profile while setting a parameter.

BOOL SystemParametersInfo(

UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update flag
);
.
 
给我发一个吧,xieyj@esquel.com
 
我网站 http://www.to-happy.com 的大事软件也碰到类似困惑,不信你看看。
 
后退
顶部