如果这个问题已被提出并已得到回答,我深表歉意,我花了三天时间在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 的日志文件。
感谢您在这件事上提供的任何帮助。
亲切的问候
里奇