Если вы хотите, чтобы это происходило глобально на всех windows в вашем приложении, лучше заранее определить свой собственный класс окна и поместить его туда. Затем извлеките весь свой windows из ВАШЕГО класса по сравнению с окном по умолчанию ... Что-то вроде
using System;
using System.Windows;
using System.Runtime.InteropServices;
using System.Windows.Interop;
namespace CaptureScreenTest
{
public class YourBaseWindow : Window
{
public YourBaseWindow()
{
Loaded += MyWindowLoaded;
}
[DllImport("user32.dll")]
public static extern uint SetWindowDisplayAffinity(IntPtr hwnd, uint dwAffinity);
private void MyWindowLoaded(object sender, RoutedEventArgs e)
{
var _curWindHandle = new WindowInteropHelper(this).Handle;
// const uint WDA_NONE = 0;
const uint WDA_MONITOR = 1;
SetWindowDisplayAffinity(_curWindHandle, WDA_MONITOR);
}
}
}
Затем во всем вашем windows, поскольку "local" ссылается на ваше пространство имен CaptureScreenTest, просто измените все ваши определения окон от ex:
<Window x:Class="CaptureScreenTest.MainWindow"
… etc...
xmlns:local="clr-namespace:CaptureScreenTest"
до
<local:YourBaseWindow x:Class="CaptureScreenTest.MainWindow"
… etc...
xmlns:local="clr-namespace:CaptureScreenTest"
Тогда вам не нужно возиться, делая это в каждом окне. Вы даже можете параметризовать свое окно, чтобы определить, хотите ли вы его включить или нет. Я сделал аналогичное объявление базового окна для своего приложения WPF, и все формы являются производными от него. У меня есть другие захваченные / постоянные функции в моем основном классе окна, и все это приходит на ходу, и мне никогда не нужно забывать реализовать на другом windows.
Теперь, поскольку ваше будущее объявление окна наследуется от этого , если у них тоже есть вызов события «Loaded», родительский класс ВСЕГДА будет делать это самостоятельно, а производный класс тоже продолжит делать то, что им нужно.