【VS2015】c++實現windows系統版本、型別、語言識別
阿新 • • 發佈:2019-01-03
1.Win8.1和Win10獲取到的版本缺一直是6.2(Win8)
相容問題。可以通過修改manifest檔案解決,也可以採用新的API來獲取版本號。
由於新的API在低版本作業系統沒有,還要特別處理,我們乾脆使用修改manifest檔案的方法,提高程式自身的相容性,從而得到正確的系統版本資訊。 內容儲存為compatibility.xml
2.API 函式: GetThreadLocale.
區域設定 ID (LCID) 表
一、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 | 波羅的語 |
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 |