C++ 为 Windows 创建屏幕保护程序

Posted

技术标签:

【中文标题】C++ 为 Windows 创建屏幕保护程序【英文标题】:C++ Creating a Screen Saver for Windows 【发布时间】:2013-08-05 04:03:59 【问题描述】:

我使用 OpenGL 和 SDL(它不使用 Windows 库)在 C++ 中创建了一个动画,并希望将其用作 Windows 系统的屏幕保护程序。我读了一个例子:它描述了你只需将.exe 扩展名更改为.scr

我已经这样做了,并将动画作为屏幕保护程序运行,但我注意到动画确实运行流畅。好像应用程序性能有所损失。

我制作的应用程序创建动画,将其设置为全屏,隐藏光标并处理所有键盘输入。如何让我的应用程序作为屏幕保护程序顺利运行?

【问题讨论】:

使用 DirectX 可能效果更好。 exe文件性能是否如你所愿? exe 文件完美运行。当我将其更改为 scr 时,它会失去性能。这是更改扩展程序时的常见问题吗? 我不确定。似乎Windows以其他方式对待 scr 。尝试将本机 Windows 屏保更改为 exe 文件并在那里比较性能a。 this 解释了如何编写屏幕保护程序。可能会有所帮助。 Windows 将屏幕保护程序的任务优先级设置为低于正常值。因此,如果您的屏幕保护程序没有正常运行,那么您的屏幕保护程序会收到更少的 CPU 时间是有道理的。 【参考方案1】:

不仅仅是重命名文件。

您至少必须支持正确的行为以响应以下命令行参数(取自Microsoft):

ScreenSaver           - Show the Settings dialog box.
ScreenSaver /c        - Show the Settings dialog box, modal to the
                        foreground window.
ScreenSaver /p <HWND> - Preview Screen Saver as child of window <HWND>.
ScreenSaver /s        - Run the Screen Saver.

如果您的可执行文件的多个实例正在启动并作为全屏屏幕保护程序运行(屏幕保护程序只有在指定 /s 时才应实际运行),这可能是您的性能问题的原因。您应该在例如任务管理器。

希望对您有所帮助。

【讨论】:

为了制作屏幕保护程序我必须制作一个Win32项目?因为我使用了 SDL,所以我需要 main 函数,因为没有它它会声明对 SDL_main 的未定义引用。 是的,创建一个 Windows 应用程序项目,只使用 main() 而不是 WinMain()。请参阅libsdl.org/tmp/SDL/VisualC.html 上的“使用 SDL 创建项目”。 好吧,自从我完成工作屏幕保护程序以来已经有一段时间了。我只使用具有适当支持的 OpenGL 将它变成了一个 Win32 项目。我的动画只是连续旋转图像,但屏幕保护程序在旋转大图像(800 X 800)时运行不顺畅,因此我必须将其缩小到(200 x 200)左右。 如何旋转图像?您应该能够通过将图像用作纹理、渲染到单个四边形并旋转四边形来平滑地旋转 800x800 图像。 是的,它是有纹理的。我正在使用矩阵变换来进行旋转和平移。我按照惰性 foo 教程创建纹理。图像作为 .exe 可以很好地旋转,但不能作为 .scr

以上是关于C++ 为 Windows 创建屏幕保护程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 在 Windows 8 中无需固定到“开始”屏幕的应用快捷方式

C++ Windows 凭据提供程序进度屏幕

在 Windows XP 中使用 C# 在登录屏幕上显示窗口

C++ 在Windows下截取整个屏幕 和 指定句柄窗口的屏幕

C++学习(三二二)Android Windows屏幕坐标

(Visual Studio 2015) 无法创建 Win32 C++ 应用程序