【发布时间】:2013-09-04 01:18:09
【问题描述】:
我希望能够在 WPF 窗口中显示屏幕保护程序的预览。 (使用容器或控件或...)我知道 Windows 本身将“/p”参数传递给屏幕保护程序以获取预览。但是如何在我的 WPF 应用程序中显示该预览?我应该处理它并将其父级更改为我的容器或控件吗?怎么样?
【问题讨论】:
标签: c# wpf screensaver
我希望能够在 WPF 窗口中显示屏幕保护程序的预览。 (使用容器或控件或...)我知道 Windows 本身将“/p”参数传递给屏幕保护程序以获取预览。但是如何在我的 WPF 应用程序中显示该预览?我应该处理它并将其父级更改为我的容器或控件吗?怎么样?
【问题讨论】:
标签: c# wpf screensaver
您需要使用 Windows.Forms 互操作,因为屏幕保护程序需要窗口句柄 (HWND),而在 WPF 中,只有顶级窗口有它们。
MainWindow.xaml
<Window x:Class="So18547663WpfScreenSaverPreview.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="Screen Saver Preview" Height="350" Width="525"
Loaded="MainWindow_OnLoaded" Closed="MainWindow_OnClosed"
SizeToContent="WidthAndHeight">
<StackPanel Orientation="Vertical" Margin="8">
<TextBlock Text="Preview"/>
<WindowsFormsHost x:Name="host" Width="320" Height="240">
<forms:Control Width="320" Height="240"/>
</WindowsFormsHost>
</StackPanel>
</Window>
MainWindow.xaml.cs
using System;
using System.Diagnostics;
using System.Windows;
namespace So18547663WpfScreenSaverPreview
{
public partial class MainWindow
{
private Process saver;
public MainWindow ()
{
InitializeComponent();
}
private void MainWindow_OnLoaded (object sender, RoutedEventArgs e)
{
saver = Process.Start(new ProcessStartInfo {
FileName = "Bubbles.scr",
Arguments = "/p " + host.Child.Handle,
UseShellExecute = false,
});
}
private void MainWindow_OnClosed (object sender, EventArgs e)
{
// Optional. Screen savers should close themselves
// when the parent window is destroyed.
saver.Kill();
}
}
}
程序集参考
WindowsFormsIntegrationSystem.Windows.Forms相关链接
【讨论】:
Windows.Forms.Control 在 XAML 中创建。这是我第一次使用 Windows 窗体互操作;看起来 MSDN 上的说明有点复杂。
if(saver != null && saver.HasExited == false) saver.Kill(); saver = new Process(); saver = Process.Start(new ProcessStartInfo { FileName = (comboScreenSavers.SelectedItem as ComboBoxItem).Tag.ToString(), Arguments = "/p " + hostScreenSaver.Child.Handle, UseShellExecute = false, }); 但是一团糟……