我使用Vista的TaskDialog其实封装和仿真器用于WindowsForms。
它工作正常,但我怎么可以改变按钮的语言?
我使用Vista的TaskDialog其实封装和仿真器用于WindowsForms。
它工作正常,但我怎么可以改变按钮的语言?
我有理由认为通用按键的变化的语言是不可能的。 (常用按钮都在特殊的方式处理,并返回结果特殊,请参阅TASKDIALOGCONFIG结构 ,没有提供语言更改选项。)
所以,如果你正在谈论通用按键的语言的变化Yes
, No
, OK
, Cancel
, Retry
, Close
,然后在标签上的文字是从活动的Windows界面语言的资源采取的。 这是相同的情况下,与按钮MsgBox()
这是有从Windows的开始对话。 (按钮Yes
, No
, OK
, Cancel
, Abort
, Retry
, Ignore
, Help
)。我相信在共同的按钮措辞不言善变,以保持均匀度在所有基本对话框在同一台机器上。
您的应用程序并不孤单这个问题,谁在不同的语言已经安装的应用程序简单地接受这种行为,不把它作为一个bug大多数用户。 你总是可以解释这是使用Windows提供的模板所做的对话框标准行为。 你很清楚,标签的变化是不是唯一的,但 TaskDialog其实 许多制约因素之一 。
解决方法是,虽然伴随着这一点,你正在失去创建链接的能力创建自定义按钮。 如果你正在编写大型应用程序,可以考虑这种类型的对话框和许多应用程序已经实现了自己的写作基础,太。
从未来的问候!
其实你可以,因为我是通过阅读学会InitMUILanguage()VS的MessageBox() ,因为我想改变语言。 对我来说InitMUILanguage
不工作(和它使用的语言气馁概念ID,见上面的“咆哮” LANG_NEUTRAL
在winnt.h
)。 但SetProcessPreferredUILanguages
和SetThreadPreferredUILanguages
都这样做。
下面是如何使用它(调整你链接的例子):
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using static TaskDialog.NativeMethods;
namespace TaskDialog
{
internal static class Program
{
[STAThread]
static void Main()
{
//Remove the check if you know your parameters are in the correct format
CheckResult(SetProcessPreferredUILanguages(MUI_LANGUAGE_NAME, MakeMultiString("ab-CD", "zh-cn"), out _));
//Or SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, MakeMultiString("ab-CD", "zh-cn"), out _);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
internal static class NativeMethods
{
public static void CheckResult(bool success)
{
if (!success)
{
var ex = new Win32Exception();
Debug.WriteLine($"Error 0x{ex.NativeErrorCode:X}");
throw ex;
}
}
//Generates a double null-terminated multi-string buffer (PCZZWSTR)
public static string MakeMultiString(params string[] items) => string.Join("\0", items) + "\0";
//WinNls.h
public const uint MUI_LANGUAGE_NAME = 0x8; // Use ISO language (culture) name convention
//Omitting CharSet sets it to Ansi which is not what we want
// Even after typing this I changed this to Ansi to test it again and forgot to change it back;
// took me quite some time to figure out what was going on
//https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-setprocesspreferreduilanguages
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool SetProcessPreferredUILanguages(
uint dwFlags,
string pwszLanguagesBuffer,
out uint pulNumLanguages
);
//https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-setthreadpreferreduilanguages#c#-signature
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool SetThreadPreferredUILanguages(
uint dwFlags,
string pwszLanguagesBuffer,
out uint pulNumLanguages
);
}
}
pwszLanguagesBuffer
接收由两个字母的语言环境的列表的ISO 639-1语言名称和一个双字母ISO 3166-1α-2由连字符分隔区域代码,以递减的优先级顺序。 在这种情况下ab-CD
不是现有的区域设置,因此zh-CN
(中国的一个变体)被选择。 只有第5周有效的语言将被考虑。
需要注意的是,在每一个项目pwszLanguagesBuffer
列表必须以NULL字符(结束\0
或\u0000
)。 额外的+ '\0'
是因为string.Join
只插入项目之间的分隔符。 该列表会被使用一个额外的NULL终止,由.NET自动插入关闭(因为它是一个字符串参数)。
结果:
相关阅读: 如何设置了一个多线程的.NET程序UI语言,独立于操作系统的语言?