Stroylong Ответов: 2

При использовании захвата системных сообщений C #, как отличить сообщение выключено или перезапущено?


In the use of C # system message capture, how to distinguish the message is off or restart?


Что я уже пробовал:

//系统关机事件捕获, 并发送数据给串口
        private const int WM_QUERYENDSESSION = 0x0011;
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            try
            {
                switch (m.Msg)
                {
                    case WM_QUERYENDSESSION: //暂时屏蔽关机拦截
                        m.Result = (IntPtr)1;
                        break;
                }
                base.WndProc(ref m);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

2 Ответов

Рейтинг:
6

Jochen Arndt

Видеть Сообщение WM_QUERYENDSESSION (Windows)[^]. Дополнительная информация передается в lParam член (LParam для System.Windows.Forms.Message):

Цитата:
параметр lparam

Этот параметр может иметь одно или несколько следующих значений. Если этот параметр равен 0, то система завершает работу или перезапускается (определить, какое событие происходит, невозможно).
Таким образом, вы не можете обнаружить перезапуск.


Stroylong

Есть ли какое-либо решение, чтобы узнать, выключена ли система или перезапущена? Спасибо!

Jochen Arndt

Я не знаю решения и думаю, что его нет.

Stroylong

Спасибо вам за ваш ответ!

Jochen Arndt

Добро пожаловать.

Все, что я нашел с помощью быстрого поиска, это:
http://stackoverflow.com/questions/981306/how-to-detect-whether-windows-is-shutting-down-or-restarting

Так что вы можете прочитать журнал событий. Но это довольно сложная задача, требующая решения особых случаев.

Stroylong

Спасибо,

Рейтинг:
12

CHill60

Согласно документации - Сообщение WM_QUERYENDSESSION (Windows)[^] это невозможно...

Цитата:
Если этот параметр равен 0, то система завершает работу или перезапускается (определить, какое событие происходит, невозможно).


Здесь есть несколько предложений - c++ - Как определить, выключается ли Windows или перезапускается[^] о том, как вы могли бы принять разумное "предположение" о том, что происходит - см. Решение от Даната.

Я действительно не понимаю, почему вы хотите знать разницу, хотя


Stroylong

Есть ли какой-нибудь способ узнать, выключена ли система или перезапущена? Спасибо!

CHill60

Нет, нет. В документации это совершенно ясно сказано

Stroylong

Есть ли какое-то другое решение? В дополнение к такому решению!

CHill60

Я обновил свое решение

Stroylong

Потому что мне нужно сообщить микроконтроллеру о запуске и закрытии, а также после некоторой обработки событий! Большое вам спасибо за ваш ответ!

CHill60

Если бы это был я, у меня был бы сервис для запуска на ПК Start, чтобы запустить микроконтроллер и закрыть его, когда приложение закроется. Тогда не имело бы значения, если бы это был перезапуск. Имейте в виду, что методы, предложенные по ссылке, которую я предоставил, отличаются от каждой версии Windows, поэтому вы делаете свое приложение не обновляемым.

Stroylong

Спасибо,