我是否可以调用C ++ .NET函数来检测我的程序是否在兼容模式下运行?如果没有,有人可以给我一个代码吗?感谢。
例如:
程序加载 兼容模式检查 如果是,则退出 否则运行
答案 0 :(得分:8)
来自其他论坛
经过一些谷歌搜索进入后 徒劳,我决定自己试验一下。 我发现兼容性 每个可执行文件的设置是 存储 - 正如我想的那样 - 存在 Windows注册表。
存储设置的键 是
HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows NT \ CURRENTVERSION \ AppCompatFlags \层对于每个有它的应用程序 指定兼容性设置, 该密钥下存在一个值 谁的名字是通往 可执行文件和数据是一个字符串 由兼容性组成 设置。
字符串中的关键字 指定兼容性设置 是:WIN95 WIN98 NT4SP5
WIN2000 256COLOR 640X480
DISABLETHEMES DISABLECICERO如果指定了多个设置(或 将被指定),数据 由上面的设置组成 每个空间隔开一个空格。首先 四个设置是互斥的, 即只有其中一个 指定(如果有的话)。我没有 测试了指定的后果 多个操作系统。
所以,回到解决你的问题。 检查是否有可执行文件(比方说, “C:\ path \ executable.exe”)设置为 以256色模式运行,会有 名为“C:\ path \ executable.exe”的值 (没有引号,即使是路径 在键下包含空格 [HKEY_CURRENT_USER \软件\微软\的Windows NT \ CURRENTVERSION \ AppCompatFlags \图层] 以及与该值相关的数据 将包含字符串“256COLOR”。 如果它也设置为运行 Windows下的兼容模式 98 / ME,数据将是“WIN98 256COLOR”。
所以,方法很简单。测试是否 有一个完整路径的值 密钥I下的可执行文件 上文提到的。如果没有,那么 可执行文件尚未指定任何 兼容性设置。如果值 存在,检索其数据并检查 因为“256COLOR”的存在 数据。因此,存在 “WIN95”或“WIN98”或“NT4SP5”或 “WIN2000”就意味着了 可执行文件设置为运行 该特定的兼容模式 操作系统。
答案 1 :(得分:3)
获取从GetVersionEx
返回的操作系统版本,并将其与kernel32.dll
上的文件版本进行比较。在应用程序兼容模式下,GetVersionEx
将始终返回正在“模拟”的操作系统版本。如果两个版本不同,那么您处于应用程序兼容模式。
答案 2 :(得分:1)
上面的答案帮助我得到了一个“解决方案”来解决手头的问题。它可能不是最优雅的,但似乎有效。显然,您可以在返回类型上获得更多创意。 Booleon在这里还不够。我认为原生API会很好。
typedef VOID (NTAPI* TRtlGetNtVersionNumbers)(LPDWORD pdwMajorVersion, LPDWORD pdwMinorVersion, LPDWORD pdwBuildNumber);
bool IsRunningCompatMode()
{
TRtlGetNtVersionNumbers RtlGetNtVersionNumbers = (TRtlGetNtVersionNumbers)GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetNtVersionNumbers");
assert(RtlGetNtVersionNumbers);
if(RtlGetNtVersionNumbers)
{
OSVERSIONINFO osInfo = {0};
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osInfo);
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
RtlGetNtVersionNumbers(&dwMajorVersion, &dwMinorVersion, &dwBuildNumber);
dwBuildNumber &= 0x0000FFFF;
if(osInfo.dwBuildNumber != dwBuildNumber)
{
return true;
}
}
return false;
};