使用 WPF 開發一個 Windows 螢幕保護程式

  • 2020 年 2 月 10 日
  • 筆記

使用 WPF 開發一個 Windows 螢幕保護程式

2018-12-22 02:24

最近有小夥伴問我如何可以讓 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:WindowsSystem32 文件夾中。但!那不是你放螢幕保護程式的地方!如果把你的螢幕保護程式拷貝到那個 Windows 的受信任目錄下,你的程式是無法運行起來的。正確的做法,是右鍵,使用 「安裝」 選項進行安裝。

我後面附的鏈接中可能說螢幕保護程式還要有一些其他的要求,例如必須全螢幕、不要顯示到任務欄等等。但那其實並不是強制性的要求,比如本文就顯示了一個普通的窗口。


參考資料

本文會經常更新,請閱讀原文: https://blog.walterlv.com/post/write-a-windows-scr

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