最近有小伙伴問我如何可以讓 Windows 靜置一段時間不操作之后,顯示一個特殊的界面。我想了想,屏幕保護程序可以做到這一點,而且,屏幕保護程序的開發也是非常簡單的。
本文將介紹如何為 Windows 這一悠久的功能進行開發。
屏幕保護程序的本質
屏幕保護程序本質上就是一個 Win32 窗口應用程序。
好了,這一節真的結束了……

編譯好一個窗口應用程序之后,把擴展名改為 scr,於是你的屏幕保護程序就做好了。
安裝屏幕保護程序
現在,在你的 scr 程序上點擊右鍵,可以看到一個 “安裝” 選項,點擊之后就安裝了。

安裝之后,你會立即看到我們的屏幕保護程序已經運行起來了。

為了方便截圖,我調了下窗口大小。實際上本應該是 Visual Studio 創建的空 WPF 程序的默認大小。
處理屏幕保護程序參數
我的屏幕保護程序是一個非常簡單的程序,幾乎就是默認的模板。只是,現在加上了一點文字,輸出命令行參數。
<Window x:Class="Walterlv.DirextXDemo.Wpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Title="Walterlv.ScreenSaver" Height="450" Width="800">
<Grid>
<TextBlock x:Name="ArgsTextBlock" VerticalAlignment="Center" TextAlignment="Center" />
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private async void OnLoaded(object sender, RoutedEventArgs e)
{
var args = Environment.GetCommandLineArgs().Skip(1).ToArray();
Args.Text = string.Join(Environment.NewLine, args);
}
}
在前面的截圖中,我們看到參數是 “/p 8457636”,這是表示此程序需要在預覽窗格中進行預覽。
還有其他參數,用於處理其他情況:
/s屏幕保護程序開始,或者用戶點擊了 “預覽” 按鈕/c:463970用戶點擊了 “設置” 按鈕/p 8457636用戶選中屏幕保護程序之后,在預覽窗格中顯示

實際上屏幕保護程序開始和預覽是不同的。預覽的時候,只會啟動你的程序;而實際開始的時候,Windows 會先為你創建一個白色的背景,覆蓋所有的屏幕,然后你的屏幕保護程序窗口顯示在那個白色的背景之上。

請預防一些坑
你可能會發現 Windows 自帶的屏幕保護程序在 C:\Windows\System32 文件夾中。但!那不是你放屏幕保護程序的地方!如果把你的屏幕保護程序拷貝到那個 Windows 的受信任目錄下,你的程序是無法運行起來的。正確的做法,是右鍵,使用 “安裝” 選項進行安裝。
我后面附的鏈接中可能說屏幕保護程序還要有一些其他的要求,例如必須全屏、不要顯示到任務欄等等。但那其實並不是強制性的要求,比如本文就顯示了一個普通的窗口。
參考資料
我的博客會首發於 https://walterlv.com/,而 CSDN 和博客園僅從其中摘選發布,而且一旦發布了就不再更新。

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://blog.csdn.net/wpwalter),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我聯系。
