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



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




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

1.Win8.1和Win10获取到的版本缺一直是6.2(Win8)
兼容问题。可以通过修改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中文(台湾和香港繁体)1200Unicode
1250东欧语言1251西里尔语
1252美国和西欧语言1253希腊语
1254土耳其语1255希伯来语
1256阿拉伯语1257波罗的语


2.API 函数: GetThreadLocale.


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

  
  

区域设置 ID (LCID) 表

区域设置描述简写十六进制值十进制值
南非荷兰语af0x04361078
阿尔巴尼亚语sq0x041C1052
阿拉伯语 - 阿拉伯联合酋长国ar-ae0x380114337
阿拉伯语 - 巴林ar-bh0x3C0115361
阿拉伯语 - 阿尔及利亚ar-dz0x14015121
阿拉伯语 - 埃及ar-eg0x0C013073
阿拉伯语 - 伊拉克ar-iq0x08012049
阿拉伯语 - 约旦ar-jo0x2C0111265
阿拉伯语 - 科威特ar-kw0x340113313
阿拉伯语 - 黎巴嫩ar-lb0x300112289
阿拉伯语 - 利比亚ar-ly0x10014097
阿拉伯语 - 摩洛哥ar-ma0x18016145
阿拉伯语 - 阿曼ar-om0x20018193
阿拉伯语 - 卡塔尔ar-qa0x400116385
阿拉伯语 - 沙特阿拉伯ar-sa0x04011025
阿拉伯语 - 叙利亚ar-sy0x280110241
阿拉伯语 - 突尼斯ar-tn0x1C017169
阿拉伯语 - 也门ar-ye0x24019217
巴斯克语eu0x042D1069
白俄罗斯语be0x04231059
保加利亚语bg0x04021026
加泰罗尼亚语ca0x04031027
中文 - 中华人民共和国zh-cn0x08042052
中文 - 中华人民共和国香港特别行政区zh-hk0x0C043076
中文 - 新加坡zh-sg0x10044100
中文 - 台湾地区zh-tw0x04041028
克罗地亚语hr0x041A1050
捷克语cs0x04051029
丹麦语da0x04061030
荷兰语nl0x04131043
荷兰语 - 比利时nl-be0x08132067
英语 - 澳大利亚en-au0x0C093081
英语 - 伯利兹en-bz0x280910249
英语 - 加拿大en-ca0x10094105
英语 - 爱尔兰en-ie0x18096153
英语 - 牙买加en-jm0x20098201
英语 - 新西兰en-nz0x14095129
英语 - 南非en-za0x1C097177
英语 - 特立尼达岛en-tt0x2C0911273
英语 - 英国en-gb0x08092057
英语 - 美国en-us0x04091033
爱沙尼亚语et0x04251061
波斯语fa0x04291065
芬兰语fi0x040B1035
法罗语fo0x04381080
法语 - 标准fr0x040C1036
法语 - 比利时fr-be0x080C2060
法语 - 加拿大fr-ca0x0C0C3084
法语 - 卢森堡fr-lu0x140C5132
法语 - 瑞士fr-ch0x100C4108
盖尔语 - 苏格兰gd0x043C1084
德语 - 标准de0x04071031
德语 - 奥地利de-at0x0C073079
德语 - 列支敦士登de-li0x14075127
德语 - 卢森堡de-lu0x10074103
德语 - 瑞士de-ch0x08072055
希腊语el0x04081032
Hebrewhe0x040D1037
印地语hi0x04391081
匈牙利语hu0x040E1038
冰岛语is0x040F1039
印度尼西亚语in0x04211057
意大利语 - 标准it0x04101040
意大利语 - 瑞士it-ch0x08102064
日语ja0x04111041
朝鲜语ko0x04121042
拉脱维亚语lv0x04261062
立陶宛语lt0x04271063
马其顿语mk0x042F1071
马来语 - 马来西亚ms0x043E1086
马耳他语mt0x043A1082
挪威语 - 博克马尔no0x04141044
波兰语pl0x04151045
葡萄牙语 - 标准pt0x08162070
葡萄牙语 - 巴西pt-br0x04161046
拉托-罗马语rm0x04171047
罗马尼亚语ro0x04181048
罗马尼亚语 - 摩尔多瓦ro-mo0x08182072
俄语ru0x04191049
俄语 - 摩尔多瓦ru-mo0x08192073
塞尔维亚语 - 塞瑞利克sr0x0C1A3098
Setsuanatn0x04321074
斯洛文尼亚语sl0x04241060
斯洛伐克语sk0x041B1051
索布语sb0x042E1070
西班牙语 - 标准es0x040A1034
西班牙语 - 阿根廷es-ar0x2C0A11274
西班牙语 - 玻利维亚es-bo0x400A16394
西班牙语 - 智利es-cl0x340A13322
西班牙语 - 哥伦比亚es-co0x240A9226
西班牙语 - 哥斯达黎加es-cr0x140A5130
西班牙语 - 多米尼加共和国es-do0x1C0A7178
西班牙语 - 厄瓜多尔es-ec0x300A12298
西班牙语 - 危地马拉es-gt0x100A4106
西班牙语 - 洪都拉斯es-hn0x480A18442
西班牙语 - 墨西哥es-mx0x080A2058
西班牙语 - 尼加拉瓜es-ni0x4C0A19466
西班牙语 - 巴拿马es-pa0x180A6154
西班牙语 - 秘鲁es-pe0x280A10250
西班牙语 - 波多黎各es-pr0x500A20490
西班牙语 - 巴拉圭es-py0x3C0A15370
西班牙语 - 萨尔瓦多es-sv0x440A17418
西班牙语 - 乌拉圭es-uy0x380A14346
西班牙语 - 委内瑞拉es-ve0x200A8202
苏图语sx0x04301072
瑞典语sv0x041D1053
瑞典语 - 芬兰sv-fi0x081D2077
泰语th0x041E1054
土耳其语tr0x041F1055
汤加语ts0x04311073
乌克兰语uk0x04221058
乌尔都语 - 巴基斯坦ur0x04201056
越南语vi0x042A1066
科萨语xh0x04341076
意第绪语ji0x043D1085
祖鲁语zu0x04351077


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值