Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Закрытие приложения / 4 сообщений из 4, страница 1 из 1
04.08.2014, 13:06
    #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
05.08.2014, 14:58
    #38713128
TooHot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие приложения
Каким образом другое приложение закрывает ваше?
...
Рейтинг: 0 / 0
05.08.2014, 16:22
    #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
05.08.2014, 17:28
    #38713339
NumezmaT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие приложения
TooHot, Спасибо все получилось.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Закрытие приложения / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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