Получение либо WM_QueryEndSession, либо WM_WTSSESSIONCHANGE в WinPE10 в C # - PullRequest
0 голосов
/ 24 мая 2018

Приношу свои извинения, если этот вопрос был задан и уже получен ответ, я провел большую часть трех дней, экспериментируя с WndProc () в WinPE (для Windows 10).

Какя могу «поймать» сообщения через WndProc () (или процедуру обработки) в WinPE (Windows 10)?

У меня есть пользовательское приложение (написано на C # .Net 4.5.2)запускается WinPEShl.exe при загрузке WinPE.В настоящее время это приложение, которое предоставляет доступ к другим приложениям для включения развертывания Windows или захвата изображения.

Хотя это приложение не всегда является текущей формой Windows, существует одна или две подпрограммы, которые необходимо выполнить перед WindowsЧП отключился.Я хотел бы, чтобы это происходило с уведомлениями WM_QUERYENDSESSION / WM_ENDSESSION или WTS_SESSION_CHANGE через переопределенную функцию WndProc ().

В настоящее время это моя функция WndProc ():

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        // Listen for operating system messages.
        if (m.Msg == WM_QUERYENDSESSION)
        {
            Program.WriteLogFile(4, 1, "WM_QUERYENDSISSION: received. Return Bool=True");
        }
        if (m.Msg == WTS.WM_WTSSESSION_CHANGE)
        {
            int wValue = m.WParam.ToInt32();
            if (wValue == WTS.WTS_SESSION_LOGOFF)
            {
                //Write my darn Log file!
                Program.WriteLogFile(4, 1, "WM_WTS_SESSION_LOGOFF: received. Return Bool=True");
            }
            if (wValue == WTS.WTS_CONSOLE_DISCONNECT)
            {
                Program.WriteLogFile(4, 1, "WM_WTS_SESSION_DISCONNECT: received. Return Bool=True");
            }
        }
        base.WndProc(ref m);
    }

Program.WriteLogFile() - это средство записи файла журнала (как оно говорит!), которое будет использоваться для сообщения о завершении работы системы.

Из этой ссылки я знаю, что WinPE является потокомверсия Windows, только небольшое количество API доступно для использования.Я просмотрел оба набора MinCore.lib для обоих упомянутых наборов Windows API, что привело к успеху при поиске любой функции, связанной с функцией-держателем WndProc ().Я даже запустил OneCore.lib.

Однако я нашел функции WTSRegiSessionNotifications ().Опять же, несмотря на то, что они нормально регистрируются в WinPE, мое приложение Shell не получает сообщения, если другое приложение выключает систему (например, программа установки Windows по завершении первого этапа).

Тестирование в Windows дает оба результатав связанном файле журнала приложения.

Должен ли я использовать скрытое консольное приложение, чтобы захватить CTRL_LOGOFF_EVENT / CTRL-SHUTDOWN_EVENT, или я должен использовать службу (и все ли записи в журнале маршрутизируются через нее)?

Файлы журналов из Windows 10 (работают должным образом) и WinPE доступны по запросу.

Спасибо за любую помощь в этом вопросе.

С уважением

Richie

1 Ответ

0 голосов
/ 31 мая 2018

Я не уверен, почему вы не используете обычные winform формы из событий жизни.Я предполагаю, что вы несколько более привыкли к C-ориентированным способам ведения дел?

Если вы создали winpeshl.ini, который запускает вашу программу, и это единственная программа в списке (за пределами winpeinit.exe)), затем, когда он выключается, PE выключается.Это верно, даже если вы порождаете другие приложения из своей основной программы (через System.Diagnostics.Process).

Итак, не перечисляйте много программ в winpeshl.ini.Позвольте вашей единственной основной программе запустить остальные.

FWIW, у меня есть похожее приложение ... выполняет захват изображений, развертывание и периодическое обслуживание.Мы помещаем наш winPE в отдельный раздел и активно управляем BCD, чтобы он загрузился, когда мы захотим.Я закрыл все "нормальные" маршруты отключения.Да, я полагаю, постоянный пользователь может обойтись ... но если они настроены, пусть будет так ... но у нас с этим не было проблем.

...