0

如果这个问题已被提出并已得到回答,我深表歉意,我花了三天时间在WinPE 中试验 WndProc()(适用于 Windows 10)。

如何在WinPE(Windows 10)中通过 WndProc()(或处理程序例程)“捕获”消息?

我有一个由 WinPEShl.exe 在 WinPE 启动时启动的自定义应用程序(用 C# .Net 4.5.2 编写)。这是当前提供对其他应用程序的访问以启用 Windows 部署或图像捕获的应用程序。

虽然此应用程序可能并不总是当前的 Windows 窗体,但在 Windows PE 关闭之前需要完成一两个例程。我希望通过覆盖的 WndProc() 函数在 WM_QUERYENDSESSION/WM_ENDSESSION 或 WTS_SESSION_CHANGE 通知上发生这种情况。

目前这是我的 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 可供使用。我已经查看了提到的两个 Windows API 集的两个 MinCore.lib 集 - 导致查找与 WndProc() 持有者函数相关的任何函数都没有成功。我什至搜索过 OneCore.lib。

然而,我确实找到了 WTSRegiSessionNotifications() 函数。同样,即使它们在 WinPE 中注册良好,如果另一个应用程序关闭系统(例如第一阶段完成时的 Windows 安装程序),我的 Shell 应用程序也不会收到消息。

Windows 中的测试在关联的应用程序日志文件中提供这两个结果。

我应该使用隐藏的控制台应用程序来捕获 CTRL_LOGOFF_EVENT/CTRL-SHUTDOWN_EVENT,还是应该使用服务(并且所有日志写入都通过它路由)?

可根据要求提供来自 Windows 10(按原样工作)和 WinPE 的日志文件。

感谢您在这件事上提供的任何帮助。

亲切的问候

里奇

4

1 回答 1

0

我不确定你为什么不使用常规的 winforms 形式的生命周期事件。我猜你更习惯于面向 C 的做事方式?

如果您构建了一个winpeshl.ini启动程序的程序,并且它是列出的唯一程序(超出winpeinit.exe),那么当它关闭时,PE 就会关闭。即使您从主程序(通过 System.Diagnostics.Process)生成其他应用程序也是如此。

所以,不要在winpeshl.ini. 让您的唯一主程序开始其余的工作。

FWIW,我有一个类似的应用程序...进行图像捕获、部署和定期维护。我们将我们的 winPE 放在它自己的分区中,并进行大量主动 BCD 管理以使其在需要时启动。我已经关闭了所有“正常”关机路线。是的,我想一个持久的用户可以规避......但如果他们下定决心,那就这样吧......但我们对此没有任何问题。

于 2018-05-31T18:51:25.477 回答