阻止在 Windows 7 上运行的 Win32 控制台应用程序提前终止的正确方法是什么?
Vista 推出后,有关方式发生了变化应用程序关闭 http://msdn.microsoft.com/en-us/library/ms700677%28v=vs.85%29.aspx发生了。 XP 中的行为是打开一个 UI 来请求用户是否要强制关闭,与此相反,如果不以编程方式阻止该进程,Windows Vista(和 7)将终止该进程。控制台应用程序和没有可见顶级窗口的应用程序也必须使用新功能关闭块请求创建 http://msdn.microsoft.com/en-us/library/aa376877%28v=VS.85%29.aspx提供 Vista 在弹出的 UI 中显示的原因,否则它将在 5 秒后终止程序。
下面是我在 Win32 控制台应用程序中使用 ShutdownBlockRequestCreate 函数的尝试;向导创建后,预编译头选项已从项目中删除。每当我使用该函数时,我都会收到错误代码 5,对应于 ERROR_ACCESS_DENIED。这显然是(根据应用程序关闭链接 http://msdn.microsoft.com/en-us/library/ms700677%28v=vs.85%29.aspx)因为我没有从用于创建窗口(控制台窗口)的同一线程调用该函数。
#include <iostream>
#include <tchar.h>
#include <conio.h>
#include <windows.h>
typedef BOOL (WINAPI *SBRCREATEFUNC)(HWND,LPCWSTR);
void RegisterShutdownBlockReason() {
SBRCREATEFUNC ShutdownBlockReasonCreate;
HWND hWnd = GetForegroundWindow();
HINSTANCE hinstLib = LoadLibrary(TEXT("user32.dll"));
if (hinstLib != NULL) {
ShutdownBlockReasonCreate = (SBRCREATEFUNC) GetProcAddress(hinstLib,"ShutdownBlockReasonCreate");
if(ShutdownBlockReasonCreate != NULL) {
if(!(ShutdownBlockReasonCreate) (hWnd, L"Terminating Communication Sessions")) {
printf("\nfailed To Register Reason, failure code: %d\n", GetLastError());
} else {
printf("\nRegistered Reason\n");
}
} else {
printf("\nCouldn't load ShutdownBlockReasonCreate procedure\n");
}
} else {
printf("\nFailed to LoadLibrary(\"user32.dll\")\n");
}
}
int _tmain(int argc, _TCHAR* argv[]) {
RegisterShutdownBlockReason();
printf("Type to terminate program.\n");
getch();
return 0;
};
作为解决方法,您可以在启动时创建一个仅显示消息的窗口并使用ShutdownBlockReasonCreate
在它的窗把手上?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)