65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (8投票s)

2009年5月20日

CPL

2分钟阅读

viewsIcon

37064

学习如何通过 .NET 和 C# 使用 API 以编程方式开启屏幕保护程序。

我还在我的博客上写了这篇文章,Just Like a Magic

概述

本教程重点介绍如何通过编程方式开启屏幕保护程序。

背景

在 Windows 中,您可以让机器在一段时间不活动后自动开启屏幕保护程序。您可以从桌面属性对话框中的屏幕保护程序选项控制这段时间。下图显示了屏幕保护程序设置对话框。

Screen Saver Settings

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

在本节中,我们将学习如何在 .NET 和 C# 中开启屏幕保护程序。当然,您可以使用任何您喜欢的语言编写代码,但我们将在 C# 中编写它。您可以通过发送带有参数 SC_SCREENSAVEWM_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 原始句柄的最佳类型,因此我们已将其用于第一个参数。UINTWPARAMLPARAM 都定义为无符号的 32 位整数,因此我们已将其编组为 System.UInt32HWND_BROADCAST 表示所有顶级窗口的句柄,因此我们已向它们发送开启屏幕保护程序的指令。

PInvoke 代表平台调用,它是为 .NET 创建包装器以与非托管函数交互的过程。

编组是将 .NET 类型与非托管类型连接起来的过程。

如果您想异步发送消息并且不想等待响应,可以使用 PostMessage() 代替 SendMessage()

历史

  • 2009 年 5 月 20 日:初始发布
© . All rights reserved.