如何获取当前键盘布局的代码页?

我的非Unicode应用程序需要能够处理Unicode键盘input(WM_CHAR /等),从而接收8位字符代码,然后在内部将其转换为Unicode。 9x兼容性是必需的,所以使用大多数Unicode API不是一个选项。

目前,它查看PRIMARYLANGID(GetKeyboardLayout(0))返回的语言,并在硬编码表中查找相关代码页。 我找不到一个函数来获取特定语言或键盘布局使用的代码页。 然后可以使用MultiByteToWideChar来转换字符/string。

有没有办法获得当前的键盘布局的代码页? GetACP返回默认的系统代码页面,不受当前键盘布局的影响。

Solutions Collecting From Web of "如何获取当前键盘布局的代码页?"

这是另一种方法:

WORD languageID = LOWORD(GetKeyboardLayout(0)); char szLCData[6+1]; GetLocaleInfoA(MAKELCID(languageID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, szLCData, _countof(szLCData)); int codepage = atoi(szLCData); 

虽然这是一个旧的线程,但是我只是花了大部分时间搜索一个给定特定字符集 ID(当前键盘布局/语言环境未设置为该字符集时)的Windows 代码页的方法。 我认为,示例代码可能会被其他人用来寻找类似的信息。

在我的情况下,我想映射一个字符集值,如161(希腊语)相当于Windows代码页1253。经过大量的挖掘,我想出了以下内容:

 /* * Convert a font charset value (eg 161 - Greek) into a Windows codepage (1253 for Greek) */ UINT CodepageFromCharset(UINT nCharset) { UINT nCodepage = CP_ACP; CHARSETINFO csi = {0}; // Note, the symbol charset (2, CS_SYMBOL) translates to the symbol codepage (42, CP_SYMBOL). // However, this codepage does NOT produce valid character translations so the ANSI charset // (ANSI_CHARSET) is used instead. This appears to be a known problem. // See this discussion: "More than you ever wanted to know about CP_SYMBOL" // (http://www.siao2.com/2005/11/08/490495.aspx) if (nCharset == SYMBOL_CHARSET) nCharset = 0; DWORD* lpdw = (DWORD*)nCharset; // Non-zero return value indicates success... if (TranslateCharsetInfo(lpdw, &csi, TCI_SRCCHARSET) == 0) { // This should *not* happen but just in case make sure we use a valid default codepage. #ifdef _UNICODE csi.ciACP = 1200; #else csi.ciACP = CP_ACP; #endif } return csi.ciACP; } 

希望这对其他人有用!

约翰

对于需要在Windows 9X上运行的应用程序,我遇到了类似的问题。 我最终想出的解决方案是监听WM_INPUTLANGCHANGE通知消息,当用户改变输入语言时,这些消息被发送到顶层窗口。 在我的消息过程中,我有这样的东西:

 case WM_INPUTLANGCHANGE: { CHARSETINFO cs; if (TranslateCharsetInfo((DWORD*)wParam,&cs,TCI_SRCCHARSET)) m_codePage = cs.ciACP; return DefWindowProc(WM_INPUTLANGCHANGE,wParam,lParam); } break; 

其中m_codePage是初始化为的单元

  m_codePage = CP_ACP; 

然后在调用MultiByteToWideChar()来处理WM_CHAR等的键时使用m___codePage