Запрет захвата экрана в Windows с C # и WPF - PullRequest
0 голосов
/ 06 февраля 2019

Я пытался предотвратить скриншоты моего окна 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 голосов
/ 06 февраля 2019

Добавьте обработчик событий к событию 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, если окно не загружено и после загрузки оно будет иметь значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...