You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用C++和MFC在Windows 10运行时添加中日语言条目

在Windows 10中用C++/MFC运行时添加中文和日文语言条目

我之前也踩过同样的坑——用LoadKeyboardLayoutActivateKeyboardLayout切换欧美语言完全没问题,但中文、日文必须先在系统语言列表里预装才能生效。下面是我实践验证过的两种可行方案,适配MFC程序的场景:

方案一:调用系统NLS原生API(编程式安装)

Windows 10提供了NLS(National Language Support)系列API来直接操作语言包,核心是InstallLanguagePack函数。这种方式更灵活,但需要注意权限和资源准备:

前置准备

  • 程序必须以管理员权限运行:在MFC项目的链接器设置里,把「Manifest File」→「UAC Execution Level」设为requireAdministrator,确保程序启动时提权
  • 提前准备对应语言的语言包文件:中文(zh-CN)、日文(ja-JP)的语言包可以从微软官网下载,或者提取Windows镜像中的.cab格式包

代码实现示例

#include <nlssetup.h>
#pragma comment(lib, "nlssetup.lib")

// 检查目标语言是否已安装
BOOL IsLanguageInstalled(LPCWSTR langTag) {
    return IsLanguagePackInstalled(langTag, LANGPACK_TYPE_FULL);
}

// 安装指定语言包
BOOL InstallTargetLanguage(LPCWSTR langTag, LPCWSTR packagePath) {
    NL_SETUP_PACKAGE_INFO packageInfo = {0};
    packageInfo.cbSize = sizeof(NL_SETUP_PACKAGE_INFO);
    packageInfo.packagePath = packagePath;
    packageInfo.languageTag = langTag;

    // 同步安装,进度回调可设为NULL(如需显示进度可自定义回调函数)
    return InstallLanguagePack(&packageInfo, NULL, NULL, NULL);
}

// MFC对话框中调用的示例(比如绑定到安装按钮的点击事件)
void CMyLangSetupDlg::OnBtnInstallChinese() {
    const LPCWSTR zhLangTag = L"zh-CN";
    if (IsLanguageInstalled(zhLangTag)) {
        AfxMessageBox(_T("中文语言包已存在"));
        return;
    }

    // 假设语言包路径为D:\LangPacks\zh-cn.cab
    BOOL installResult = InstallTargetLanguage(zhLangTag, L"D:\\LangPacks\\zh-cn.cab");
    if (installResult) {
        AfxMessageBox(_T("中文语言包安装成功,请重启程序生效"));
        // 广播消息刷新系统语言列表
        SendMessage(HWND_BROADCAST, WM_INPUTLANGCHANGEREQUEST, 0, 0);
    } else {
        DWORD errCode = GetLastError();
        CString errMsg;
        errMsg.Format(_T("安装失败,错误码:%d"), errCode);
        AfxMessageBox(errMsg);
    }
}

方案二:调用系统lpksetup工具(轻量快捷实现)

如果不想处理复杂的API参数,可以直接调用Windows自带的lpksetup.exe工具,通过命令行参数实现静默安装,这种方式更简单易上手:

代码示例

void CMyLangSetupDlg::OnBtnInstallJapanese() {
    // 命令行参数:/i 指定语言代码,/s 静默安装(无界面)
    CString cmdArgs = _T("/c lpksetup.exe /i ja-JP /s");
    
    SHELLEXECUTEINFO sei = {0};
    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.fMask = SEE_MASK_NOCLOSEPROCESS;
    sei.lpVerb = _T("runas"); // 要求管理员权限运行
    sei.lpFile = _T("cmd.exe");
    sei.lpParameters = cmdArgs;
    sei.nShow = SW_HIDE; // 隐藏命令行窗口

    if (ShellExecuteEx(&sei)) {
        // 等待安装完成
        WaitForSingleObject(sei.hProcess, INFINITE);
        CloseHandle(sei.hProcess);
        AfxMessageBox(_T("日文语言包安装完成,请重启程序"));
    } else {
        AfxMessageBox(_T("调用安装工具失败,请检查权限"));
    }
}

注意事项

  • 这种方式依赖系统自动获取语言包:如果客户端联网,系统会自动下载对应语言包;离线环境需要提前把语言包放到系统可识别的路径
  • 静默安装耗时较长,建议放到后台线程执行,避免阻塞UI

安装后的收尾操作

语言包安装完成后,需要:

  1. 重启程序(或通过WM_INPUTLANGCHANGEREQUEST消息刷新系统语言列表)
  2. LoadKeyboardLayout加载对应布局:中文布局ID是0x08040804,日文是0x04110411
  3. 调用ActivateKeyboardLayout激活目标布局即可正常切换

小提示:如果是企业部署场景,建议提前把语言包推送到客户端机器,避免程序运行时下载的等待延迟。

内容的提问来源于stack exchange,提问作者Alberto Bricio

火山引擎 最新活动