Обработка выключения системы в WPF
Как я могу переопределить WndProc в WPF? Когда мое окно закрывается, я пытаюсь проверить, был ли изменен файл, который я использую, и если да, я должен запросить у пользователя "Вы хотите сохранить изменения?" сообщение, затем закройте используемый файл и окно. Однако я не могу обработать случай, когда пользователь перезапускает /shutdown/logoff, когда мое окно все еще открыто. Я не могу переопределить WndProc, так как я разрабатываю с использованием WPF. Я также пытался использовать это Пример кода MSDN. Это то, что я сделал приватный void loadedForm(объект-отправитель, RoutedEventArgs e) {
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_QUERYENDSESION.)
{
OnWindowClose(this, new CancelEventArgs())
handled = true;
shutdown = true;
}
return IntPtr.Zero;
}
private void OnWindowClose(object sender, CancelEvetArgs e)
{
if (modified)
{
//show message box
//if result is yes/no
e.cancel = false;
//if cancel
e.cancel = true;
}
}
В файле XAML я также использовал Closing = "OnWindowClose"
однако ничего не происходит, когда я нажимаю да / нет, мое приложение не закрывается. и если я пытаюсь закрыть его снова с помощью кнопки закрытия, я получаю сообщение об ошибке? почему это так? это из-за крючка?? Что эквивалентно этому в WPF?
private static int WM_QUERYENDSESSION = 0x11;
private static bool systemShutdown = false;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg==WM_QUERYENDSESSION)
{
systemShutdown = true;
}
// If this is WM_QUERYENDSESSION, the closing event should be
// raised in the base WndProc.
base.WndProc(m);
} //WndProc
private void Form1_Closing(
System.Object sender,
System.ComponentModel.CancelEventArgs e)
{
if (systemShutdown)
// Reset the variable because the user might cancel the
// shutdown.
{
systemShutdown = false;
if (DialogResult.Yes==MessageBox.Show("My application",
"Do you want to save your work before logging off?",
MessageBoxButtons.YesNo))
{
SaveFile();
e.Cancel = false;
}
else{
e.Cancel = true;
}
CloseFile();
}
}
2 ответа
Почему бы не использовать событие Application.SessionEnding? Кажется, это сделано для того, чтобы делать то, что вы хотите, и вам не нужно обрабатывать сообщения Windows напрямую.
Вы можете установить Cancel в true для SessionEndingCancelEventArgs, если хотите отменить завершение работы.
Вы можете использовать
/questions/28788375/kak-simulirovat-vyiklyuchenie-windows-dlya-otladki/60270937#60270937