我试图阻止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。我发现了另一个问题,但没有说明该方法应该在哪里。
答案 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
,并且在加载窗口后将具有一个值。