以编程方式开启屏幕保护程序






4.24/5 (8投票s)
学习如何通过 .NET 和 C# 使用 API 以编程方式开启屏幕保护程序。
我还在我的博客上写了这篇文章,Just Like a Magic。
概述
本教程重点介绍如何通过编程方式开启屏幕保护程序。
背景
在 Windows 中,您可以让机器在一段时间不活动后自动开启屏幕保护程序。您可以从桌面属性对话框中的屏幕保护程序选项控制这段时间。下图显示了屏幕保护程序设置对话框。

以编程方式开启屏幕保护程序
在本节中,我们将学习如何在 .NET 和 C# 中开启屏幕保护程序。当然,您可以使用任何您喜欢的语言编写代码,但我们将在 C# 中编写它。您可以通过发送带有参数 SC_SCREENSAVE
的 WM_SYSCOMMAND
消息来开启屏幕保护程序。可以使用驻留在 User32.dll 库中的 SendMessage()
函数发送消息。此函数的定义如下
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
此函数接受四个参数
hWnd
:要发送消息到的窗口句柄。您可以将此参数设置为窗口句柄、桌面句柄 (HWND_DESKTOP
) 或所有顶级窗口的句柄 (HWND_BROADCAST
)。Msg
:要发送的消息。wParam
:其他消息特定的选项。lParam
:其他消息特定的选项。
此函数返回特定于发送的消息的值。通常,如果成功则返回非零值,否则返回零。以下是完整的代码
[DllImport("User32.dll")]
public static extern int SendMessage
(IntPtr hWnd,
uint Msg,
uint wParam,
uint lParam);
public const uint WM_SYSCOMMAND = 0x112;
public const uint SC_SCREENSAVE = 0xF140;
public enum SpecialHandles
{
HWND_DESKTOP = 0x0,
HWND_BROADCAST = 0xFFFF
}
public static void TurnOnScreenSaver()
{
SendMessage(
new IntPtr((int)SpecialHandles.HWND_BROADCAST),
WM_SYSCOMMAND,
SC_SCREENSAVE,
0);
}
代码解释
首先,我们创建了我们的 PInvoke
方法。此方法用 DllImportAttribute
属性装饰,该属性指定方法所在的库。此外,PInvoke
方法必须声明为“static
”和“extern
”。由于 LRESULT
定义为带符号的 32 位整数,因此在 .NET 中将其编组为 System.Int32
。此外,由于 System.IntPtr
是编组任何 Win32 原始句柄的最佳类型,因此我们已将其用于第一个参数。UINT
、WPARAM
和 LPARAM
都定义为无符号的 32 位整数,因此我们已将其编组为 System.UInt32
。HWND_BROADCAST
表示所有顶级窗口的句柄,因此我们已向它们发送开启屏幕保护程序的指令。
PInvoke 代表平台调用,它是为 .NET 创建包装器以与非托管函数交互的过程。
编组是将 .NET 类型与非托管类型连接起来的过程。
如果您想异步发送消息并且不想等待响应,可以使用
PostMessage()
代替SendMessage()
。
历史
- 2009 年 5 月 20 日:初始发布