使用C#和WPF阻止Windows上的屏幕捕获

时间:2019-02-06 16:22:53

标签: c# wpf

我试图阻止WPF窗口(如Microsoft Office)的屏幕截图。

我尝试使用SetWindowDisplayAffinity,但是它总是返回false,我真的不知道在哪里调用该方法。

App.xaml:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetWindowDisplayAffinity(IntPtr hwnd, DisplayAffinity affinity);

protected override void OnStartup(StartupEventArgs e)
{
    var mainView = new MainWindow();
    var ok = SetWindowDisplayAffinity(Process.GetCurrentProcess().MainWindowHandle, DisplayAffinity.Monitor);
    mainView.Show();
}

但是SetWindowDisplayAffinity方法始终返回false。我发现了另一个问题,但没有说明该方法应该在哪里。

1 个答案:

答案 0 :(得分:0)

将事件处理程序添加到主窗口中的Loaded事件中:Loaded="Window_Loaded"

然后定义该方法,如下所示:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    IntPtr handle = (new WindowInteropHelper(this)).Handle;
    bool s = SetWindowDisplayAffinity(handle, DisplayAffinity.Monitor);
    MessageBox.Show(s.ToString());
}

然后它将返回True,并且在截屏时该窗口将被涂黑。

如果将相同的代码放在InitializeComponent();之后的构造函数中,则它将返回False,并且窗口不会被遮蔽。

请注意,如果未加载窗口,(new WindowInteropHelper(this)).Handle将等于0,并且在加载窗口后将具有一个值。