Обнаружение нажатия кнопки X окна в winforms - PullRequest
2 голосов
/ 25 февраля 2012

Как я могу обнаружить событие нажатия кнопки закрытия (X) в верхнем правом углу поля управления формы / окна?Обратите внимание, я не хочу знать о CloseReason, FormClosing, FormClosed или подобных вещах, если они не являются неизбежными.Я точно хочу определить, нажал ли пользователь кнопку X формы.Спасибо.

Ответы [ 2 ]

7 голосов
/ 25 февраля 2012

Если у вас действительно есть веская причина не использовать FormClosing, CloseReason, ..., вы можете переопределить оконную процедуру и написать что-то вроде этого:

    protected override void WndProc(ref Message m)
    {
        const int WM_NCLBUTTONDOWN = 0x00A1;
        const int HTCLOSE = 20;

        if (m.Msg == WM_NCLBUTTONDOWN)
        {
            switch ((int)m.WParam)
            {
                case HTCLOSE:
                    Trace.WriteLine("Close Button clicked");
                    break;
            }
        }

        base.WndProc(ref m);
    }

Подробности можно найти здесь и здесь .

2 голосов
/ 15 сентября 2013

Я знаю, что это старый поток, но вот решение.

Чтобы получить работу WM_NCLBUTTONUP, не вызывайте базовый WndProc при получении сообщения WM_NCLBUTTONDOWN:

    protected override void WndProc(ref Message m)
    {
        const int WM_NCLBUTTONDOWN = 0x00A1;
        const int WM_NCLBUTTONUP = 0x00A2;
        const int HTCLOSE = 20;

        if (m.Msg == WM_NCLBUTTONDOWN)
        {
            switch ((int)m.WParam)
            {
                case HTCLOSE:
                    // WndProc Form implementation is buggy :
                    // to receive WM_NCLBUTTONUP message,
                    // don't call WndProc.
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }
        else
        {
            if (m.Msg == WM_NCLBUTTONUP)
            {
                switch ((int)m.WParam)
                {
                    case HTCLOSE:
                        Trace.WriteLine("Close Button clicked");
                        Close();    // Optional
                        break;
                }
            }

            base.WndProc(ref m);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...