1. 程式人生 > >【VS2015】c++實現windows系統版本、型別、語言識別

【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;
}


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);

874 泰語 932 日語
936 中文(簡體) 949 朝鮮語
950 中文(臺灣和香港繁體) 1200 Unicode
1250 東歐語言 1251 西里爾語
1252 美國和西歐語言 1253 希臘語
1254 土耳其語 1255 希伯來語
1256 阿拉伯語 1257 波羅的語
2.API 函式: GetThreadLocale.
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