牛骨文教育服务平台(让学习变的简单)
博文笔记

【VS2015】c++实现windows系统版本、类型、语言识别

创建时间:2016-09-30 投稿人: 浏览次数:2157


一、VS2015 新建项目->win32 控制台应用程序

1.以下操作实现跨平台 (1).配置属性-常规-MFC的使用->使用标准Windows库或者在静态库中使用MFC (2).配置属性-c/c++-代码生成-运行库->多线程(/MT)

二.头文件

1.stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO:  在此处引用程序需要的其他头文件


#include <afxwin.h>         // MFC core and standard components

2.GetLanaguagAndOsver.h

#pragma once
#include <windows.h>
class GetLanaguagAndOsver
{
public:
	GetLanaguagAndOsver(void);
	~GetLanaguagAndOsver(void);
	LANGID   GetLanguag(void);
	int  GetOperatorSystemVer(void);
	void OPenDvdDivece(void);
	void CloseDevice(void);
	void AutoReBootsystem(void);
	BOOL IsWow64(void);
	
};

三、源程序

1.GetLanaguagAndOsver.cpp

#include "StdAfx.h"
#include "GetLanaguagAndOsver.h"
#pragma comment(lib,"Kernel32.lib")
#include <Mmsystem.h> 
#pragma comment(lib,"winmm.lib")
#pragma warning(disable : 4996)

GetLanaguagAndOsver::GetLanaguagAndOsver(void)
{
}
GetLanaguagAndOsver::~GetLanaguagAndOsver(void)
{
}
LANGID GetLanaguagAndOsver::GetLanguag(void)
{
    WORD   LanagId =  GetSystemDefaultLangID();
	return LanagId;
}
int GetLanaguagAndOsver::GetOperatorSystemVer(void)
{     
	CString           stOSysetemVerion;
	int               iVer =  0;
	OSVERSIONINFOW    OsVersionInfo;
	OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
	GetVersionExW(&OsVersionInfo);
	if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
	{
		if (OsVersionInfo.dwMinorVersion < 10)
		{
			stOSysetemVerion = _T("Windows95");
			iVer = 1;
		}
		else if(OsVersionInfo.dwMinorVersion == 10)
		{
			stOSysetemVerion = _T("Windows98");
			iVer = 2; 
		}
		else
		{
			stOSysetemVerion = _T("WindowsMe");
			iVer =3;
		}
	}  
	else if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
	{
		if (OsVersionInfo.dwMajorVersion == 3)
		{
			stOSysetemVerion = _T("WindowsNT 3.51");
			iVer =4;
		}  
		else if(OsVersionInfo.dwMajorVersion == 4)
		{
			stOSysetemVerion = _T("WindowsNT 4");
			iVer =5;
		}
		else if (OsVersionInfo.dwMajorVersion == 5)
		{
			if (OsVersionInfo.dwMinorVersion == 0)
			{
				stOSysetemVerion = _T("Windows 2000");

				iVer =6;
			}  
			else if(OsVersionInfo.dwMinorVersion >= 1)
			{
				stOSysetemVerion = _T("Windows XP");
				iVer = 7;//windows xp;
			}
			else if(OsVersionInfo.dwMinorVersion == 2)
			{
				stOSysetemVerion = _T("Windows 2003");
				iVer = 12;//windows xp;
			}
		}
	}
	else if(OsVersionInfo.dwPlatformId == 3)
	{
		stOSysetemVerion = _T("Windows CE");
		iVer  =  8;
	}
	else
	{
		stOSysetemVerion = _T("No Name");
		iVer  =  9;
	}
	if(OsVersionInfo.dwMajorVersion == 6 && OsVersionInfo.dwMinorVersion ==0)
	{
		stOSysetemVerion = _T("vista");
		iVer = 10;
	}	 
	if (OsVersionInfo.dwMajorVersion == 6 && OsVersionInfo.dwMinorVersion ==1)
	{
		stOSysetemVerion = _T("win7");
		iVer = 11;
	}
	if ( (OsVersionInfo.dwMajorVersion ==6) && ( OsVersionInfo.dwMinorVersion == 2))
	{


		stOSysetemVerion = _T("win8");
		iVer = 13;
	}
	if ((OsVersionInfo.dwMajorVersion == 6) && (OsVersionInfo.dwMinorVersion == 3))
	{


		stOSysetemVerion = _T("win8.1");
		iVer = 14;
	}
	if ((OsVersionInfo.dwMajorVersion == 10) && (OsVersionInfo.dwMinorVersion == 0))
	{


		stOSysetemVerion = _T("win10");
		iVer = 15;
	}

         return iVer;
}
void GetLanaguagAndOsver::OPenDvdDivece(void)
{
}
void GetLanaguagAndOsver::CloseDevice(void)
{
}
void GetLanaguagAndOsver::AutoReBootsystem(void)           
{
}

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
LPFN_ISWOW64PROCESS     fnIsWow64Process; 
BOOL GetLanaguagAndOsver::IsWow64(void)
{
	BOOL     bIsWow64 = FALSE; 

	fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
		GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
	if (NULL != fnIsWow64Process)
	{
		if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
		{
			   //handle error
		}
	}
	return   bIsWow64;
}

2.ConsoleApplication1.cpp

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "GetLanaguagAndOsver.h"

/*
class CAutorunDlg : public CDialog
{

public:
	GetLanaguagAndOsver* ptrLan;
};
*/


int main()
{
	/***********************display system type*******************************************************/
	/* 
BOOL  bitlength = FALSE;
CAutorunDlg  CDialog;
bitlength = CDialog.ptrLan->IsWow64();
*/
	BOOL  bitlength = NULL;
	GetLanaguagAndOsver os;
	bitlength = os.IsWow64();
if(bitlength)
	printf("BOOL bitlength=true,the system is x64
");
else
	printf("BOOL bitlength=false,the system is x86
");
printf(" 
");
/***********************display systemdefaultLangID*******************************************************/
LANGID lang = 0;
lang = os.GetLanguag();
printf("systemdefaultLangID=%d
", lang);
//区域设置描述 简写 十六进制值 十进制值
printf("区域设置描述 简写 十六进制值 十进制值 
");
if(lang==1078)
	printf("南非荷兰语 af 0x0436  1078 ");
else if(lang==2052)
	printf("中华人民共和国 zh-cn 0x0804  2052 
");
	else if(lang==3076)
		printf("中文 - 中华人民共和国香港特别行政区 zh-hk 0x0C04  3076 
");
	else if(lang==4100)
		printf("中文 - 新加坡 zh-sg 0x1004  4100 
");
	else if(lang==1028)
		printf("中文 - 台湾地区 zh-tw 0x0404  1028 
");
	else if(lang==3081)
		printf("英语 - 澳大利亚 en-au 0x0C09  3081 
");
	else if(lang==10249)
		printf("英语 - 伯利兹 en-bz 0x2809  10249 
");
	else if(lang==4105)
		printf("英语 - 加拿大 en-ca 0x1009  4105 
");
	else if(lang== 6153)
		printf("英语 - 爱尔兰 en-ie 0x1809  6153  
");
	else if(lang== 8201)
		printf("英语 - 牙买加 en-jm 0x2009  8201  
");
	else if(lang== 5129)
		printf("英语 - 新西兰 en-nz 0x1409  5129  
");
	else if(lang = 7177)
		printf("英语 - 南非 en-za 0x1C09  7177  
");
	else if(lang== 11273)
		printf("英语 - 特立尼达岛 en-tt 0x2C09  11273  
");
	else if(lang = 2057)
		printf("英语 - 英国 en-gb 0x0809  2057  
");
	else if(lang== 1033)
		printf("英语 - 美国 en-us 0x0409  1033 
");
	printf(" 
");
/***********************display GetOperatorSystemVer*******************************************************/
	int ver = 0;
	ver = os.GetOperatorSystemVer();
	printf("the system is ");
	if(ver==1)
		printf("Windows95
");
	else if(ver == 2)
		printf("Windows98
");	
	else if (ver == 3)
		printf("WindowsMe
");	
	else if (ver == 4)
		printf("WindowsNT 3.51
");		
	else if (ver == 5)
		printf("WindowsNT 4
");			
	else if (ver == 6)
		printf("Windows 2000
");		
	else if (ver == 7)
		printf("Windows XP
");			
	else if (ver ==12)
		printf("Windows 2003
");			
	else if (ver ==8)
		printf("Windows CE
");	
	else if (ver == 9)
		printf("No Name
");	
	else if (ver == 10)
		printf("vista
");
    else if (ver ==11)
	    printf("win7
");	
	else if (ver == 13)
		printf("win8
");
	else if (ver == 13)
		printf("win8.1
");
	else if (ver == 15)
		printf("win10
");
	printf(" 
");
	/***********************end*******************************************************/
    return 0;
}




四.注意事项(来源http://blog.csdn.net/sunflover454/article/details/51525179)

1.Win8.1和Win10获取到的版本缺一直是6.2(Win8)

阅读微软说明:https://msdn.microsoft.com/en-us/library/ms724832.aspx 兼容问题。可以通过修改manifest文件解决,也可以采用新的API来获取版本号。
由于新的API在低版本操作系统没有,还要特别处理,我们干脆使用修改manifest文件的方法,提高程序自身的兼容性,从而得到正确的系统版本信息。 内容保存为compatibility.xml
<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
</assembly> 

2.配置目标

那里选则所有配置,配置属性->清单工具->输入和输出-附加清单文件 填写compatibility.xml,并把这个文件拷贝到项目源代码目录。

五、效果


其他获取系统语言版本的函数

1.UINT GetACP(void);

https://msdn.microsoft.com/en-us/library/dd318070(VS.85).aspx


874 泰语 932 日语
936 中文(简体) 949 朝鲜语
950 中文(台湾和香港繁体) 1200 Unicode
1250 东欧语言 1251 西里尔语
1252 美国和西欧语言 1253 希腊语
1254 土耳其语 1255 希伯来语
1256 阿拉伯语 1257 波罗的语

2.API 函数: GetThreadLocale. https://msdn.microsoft.com/en-us/library/windows/desktop/dd318127(v=vs.85).aspx

begin
  ShowMessage(IntToStr(GetThreadLocale)); //2052
end;

区域设置 ID (LCID) 表

区域设置描述 简写 十六进制值 十进制值
南非荷兰语 af 0x0436 1078
阿尔巴尼亚语 sq 0x041C 1052
阿拉伯语 - 阿拉伯联合酋长国 ar-ae 0x3801 14337
阿拉伯语 - 巴林 ar-bh 0x3C01 15361
阿拉伯语 - 阿尔及利亚 ar-dz 0x1401 5121
阿拉伯语 - 埃及 ar-eg 0x0C01 3073
阿拉伯语 - 伊拉克 ar-iq 0x0801 2049
阿拉伯语 - 约旦 ar-jo 0x2C01 11265
阿拉伯语 - 科威特 ar-kw 0x3401 13313
阿拉伯语 - 黎巴嫩 ar-lb 0x3001 12289
阿拉伯语 - 利比亚 ar-ly 0x1001 4097
阿拉伯语 - 摩洛哥 ar-ma 0x1801 6145
阿拉伯语 - 阿曼 ar-om 0x2001 8193
阿拉伯语 - 卡塔尔 ar-qa 0x4001 16385
阿拉伯语 - 沙特阿拉伯 ar-sa 0x0401 1025
阿拉伯语 - 叙利亚 ar-sy 0x2801 10241
阿拉伯语 - 突尼斯 ar-tn 0x1C01 7169
阿拉伯语 - 也门 ar-ye 0x2401 9217
巴斯克语 eu 0x042D 1069
白俄罗斯语 be 0x0423 1059
保加利亚语 bg 0x0402 1026
加泰罗尼亚语 ca 0x0403 1027
中文 - 中华人民共和国 zh-cn 0x0804 2052
中文 - 中华人民共和国香港特别行政区 zh-hk 0x0C04 3076
中文 - 新加坡 zh-sg 0x1004 4100
中文 - 台湾地区 zh-tw 0x0404 1028
克罗地亚语 hr 0x041A 1050
捷克语 cs 0x0405 1029
丹麦语 da 0x0406 1030
荷兰语 nl 0x0413 1043
荷兰语 - 比利时 nl-be 0x0813 2067
英语 - 澳大利亚 en-au 0x0C09 3081
英语 - 伯利兹 en-bz 0x2809 10249
英语 - 加拿大 en-ca 0x1009 4105
英语 - 爱尔兰 en-ie 0x1809 6153
英语 - 牙买加 en-jm 0x2009 8201
英语 - 新西兰 en-nz 0x1409 5129
英语 - 南非 en-za 0x1C09 7177
英语 - 特立尼达岛 en-tt 0x2C09 11273
英语 - 英国 en-gb 0x0809 2057
英语 - 美国 en-us 0x0409 1033
爱沙尼亚语 et 0x0425 1061
波斯语 fa 0x0429 1065
芬兰语 fi 0x040B 1035
法罗语 fo 0x0438 1080
法语 - 标准 fr 0x040C 1036
法语 - 比利时 fr-be 0x080C 2060
法语 - 加拿大 fr-ca 0x0C0C 3084
法语 - 卢森堡 fr-lu 0x140C 5132
法语 - 瑞士 fr-ch 0x100C 4108
盖尔语 - 苏格兰 gd 0x043C 1084
德语 - 标准 de 0x0407 1031
德语 - 奥地利 de-at 0x0C07 3079
德语 - 列支敦士登 de-li 0x1407 5127
德语 - 卢森堡 de-lu 0x1007 4103
德语 - 瑞士 de-ch 0x0807 2055
希腊语 el 0x0408 1032
Hebrew he 0x040D 1037
印地语 hi 0x0439 1081
匈牙利语 hu 0x040E 1038
冰岛语 is 0x040F 1039
印度尼西亚语 in 0x0421 1057
意大利语 - 标准 it 0x0410 1040
意大利语 - 瑞士 it-ch 0x0810 2064
日语 ja 0x0411 1041
朝鲜语 ko 0x0412 1042
拉脱维亚语 lv 0x0426 1062
立陶宛语 lt 0x0427 1063
马其顿语 mk 0x042F 1071
马来语 - 马来西亚 ms 0x043E 1086
马耳他语 mt 0x043A 1082
挪威语 - 博克马尔 no 0x0414 1044
波兰语 pl 0x0415 1045
葡萄牙语 - 标准 pt 0x0816 2070
葡萄牙语 - 巴西 pt-br 0x0416 1046
拉托-罗马语 rm 0x0417 1047
罗马尼亚语 ro 0x0418 1048
罗马尼亚语 - 摩尔多瓦 ro-mo 0x0818 2072
俄语 ru 0x0419 1049
俄语 - 摩尔多瓦 ru-mo 0x0819 2073
塞尔维亚语 - 塞瑞利克 sr 0x0C1A 3098
Setsuana tn 0x0432 1074
斯洛文尼亚语 sl 0x0424 1060
斯洛伐克语 sk 0x041B 1051
索布语 sb 0x042E 1070
西班牙语 - 标准 es 0x040A 1034
西班牙语 - 阿根廷 es-ar 0x2C0A 11274
西班牙语 - 玻利维亚 es-bo 0x400A 16394
西班牙语 - 智利 es-cl 0x340A 13322
西班牙语 - 哥伦比亚 es-co 0x240A 9226
西班牙语 - 哥斯达黎加 es-cr 0x140A 5130
西班牙语 - 多米尼加共和国 es-do 0x1C0A 7178
西班牙语 - 厄瓜多尔 es-ec 0x300A 12298
西班牙语 - 危地马拉 es-gt 0x100A 4106
西班牙语 - 洪都拉斯 es-hn 0x480A 18442
西班牙语 - 墨西哥 es-mx 0x080A 2058
西班牙语 - 尼加拉瓜 es-ni 0x4C0A 19466
西班牙语 - 巴拿马 es-pa 0x180A 6154
西班牙语 - 秘鲁 es-pe 0x280A 10250
西班牙语 - 波多黎各 es-pr 0x500A 20490
西班牙语 - 巴拉圭 es-py 0x3C0A 15370
西班牙语 - 萨尔瓦多 es-sv 0x440A 17418
西班牙语 - 乌拉圭 es-uy 0x380A 14346
西班牙语 - 委内瑞拉 es-ve 0x200A 8202
苏图语 sx 0x0430 1072
瑞典语 sv 0x041D 1053
瑞典语 - 芬兰 sv-fi 0x081D 2077
泰语 th 0x041E 1054
土耳其语 tr 0x041F 1055
汤加语 ts 0x0431 1073
乌克兰语 uk 0x0422 1058
乌尔都语 - 巴基斯坦 ur 0x0420 1056
越南语 vi 0x042A 1066
科萨语 xh 0x0434 1076
意第绪语 ji 0x043D 1085
祖鲁语 zu 0x0435 1077


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。