如何将自定义文本添加到closures屏幕,就像在Windowsclosures前安装更新时显示的那些消息一样? 例如,您有一个在关机时执行的备份脚本,您想要像安装更新时一样通知备份的进度。 有没有任何命令行工具,或一些代码库,甚至在Windows API中的东西?
请注意,这不是关于如何closures计算机,而不是closures屏幕中显示消息的方式,例如控制台应用程序或消息框。 这不是关于自定义现有的消息, 也不是关于在closures屏幕之前显示的任何closures对话框 ,并且允许用户取消closures或继续而不用等待程序终止。
这是为了理解Windows如何实现在关机时显示这些消息的方式,以及如何添加要显示的新消息,最好是带有进度信息。 要清楚,下面是一个截图。
显示此消息的wmsgapi.dll中有一个WmsgPostNotifyMessage函数。 虽然没有记录,但不应该成为使用的问题。
如上所述,似乎wmsgapi.dll
是实现这个地方,但API不公开。 我找到的解决方案是编写ScreenWrite ,它读取标准输入并将格式化的文本打印到屏幕上。 因此,关闭脚本可以达到类似的效果,源代码可以在C / C ++应用程序中重用。 示例截图:
这是一个C ++代码,可以通过消息关闭计算机。
#include <windows.h> #pragma comment( lib, "advapi32.lib" ) BOOL MySystemShutdown( LPTSTR lpMsg ) { HANDLE hToken; // handle to process token TOKEN_PRIVILEGES tkp; // pointer to token structure BOOL fResult; // system shutdown flag // Get the current process token handle so we can get shutdown // privilege. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE; // Get the LUID for shutdown privilege. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get shutdown privilege for this process. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); // Cannot test the return value of AdjustTokenPrivileges. if (GetLastError() != ERROR_SUCCESS) return FALSE; // Display the shutdown dialog box and start the countdown. fResult = InitiateSystemShutdown( NULL, // shut down local computer lpMsg, // message for user 30, // time-out period, in seconds FALSE, // ask user to close apps TRUE); // reboot after shutdown if (!fResult) return FALSE; // Disable shutdown privilege. tkp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); return TRUE; }