powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Закрытие приложения
4 сообщений из 4, страница 1 из 1
Закрытие приложения
    #38712055
NumezmaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Я реализую закрытие приложения через
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (IsActive)
            {
                if (MessageBox.Show("Закрыть приложение?", "Выход", MessageBoxButton.YesNo) == MessageBoxResult.No)
                    e.Cancel = true;
            }
        }


И все норм работает, за исключением кода программу закрывает другое приложение. В этот момент сообщение выскакивает два раза и что бы я не выбирал она закрывается.
Так вот мне надо сделать так что бы если пользователь закрывает приложение спрашивало бы действие, а если стороннее приложение то тихо закрывалось без вопросов.
...
Рейтинг: 0 / 0
Закрытие приложения
    #38713128
TooHot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каким образом другое приложение закрывает ваше?
...
Рейтинг: 0 / 0
Закрытие приложения
    #38713265
TooHot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самому стало интересно :)
В WinWofrms есть перечисление CloseReason, которое можно использовать в событиях OnClosing и OnClosed, поэтому проблем с определением причины закрытия нет.

В WPF данное перечисление отсутствует, поэтому мы можем реализовать хук для уведомления WM_SYSCOMMAND.
MSDN говорит нам следующее:

A window receives this message when the user chooses a command from the Window menu (formerly known as the system or control menu) or when the user chooses the maximize button, minimize button, restore button, or close button.

То есть нам достаточно ловить в хуке WM_SYSCOMMAND c wParm SC_CLOSE, чтобы определить, что именно пользователь закрывает наше окно.
Далее код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
using System.Windows.Interop;

        bool allowClose = true;
        private const int
            WM_SYSCOMMAND = 0x112,
            SC_CLOSE = 0xF060;

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (allowClose == false)
            {
                if (MessageBox.Show("Закрыть приложение?", "Выход", MessageBoxButton.YesNo) == MessageBoxResult.No)
                {
                    e.Cancel = true;
                    allowClose = true;
                }
            }
        }

        // вызывается для поддержки взаимодействия с Win32
        private void Window_SourceInitialized(object sender, EventArgs e)
        {
            HwndSource source = (HwndSource)HwndSource.FromVisual((Window)sender);
            source.AddHook(WndProc);
        }

        // сам обработчик событий, который получает все сообщения окна Win32
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_SYSCOMMAND)
            {
                if ((int)wParam == SC_CLOSE)
                    allowClose = false;
            }
            return IntPtr.Zero;
        }
...
Рейтинг: 0 / 0
Закрытие приложения
    #38713339
NumezmaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TooHot, Спасибо все получилось.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Закрытие приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]