我需要以语言栏显示输入语言的方式向用户显示输入语言的列表。
例如:
当前我有
class Program
{
static void Main(string[] args)
{
var langs = InputLanguage.InstalledInputLanguages;
foreach (InputLanguage lang in langs)
{
Console.WriteLine(lang.LayoutName);
}
}
}
这将打印以下内容
US
Bulgarian
Bulgarian
如您所见,我们无法分辨两个“保加利亚人”之间的区别 哪一个是BGPT,哪一个仅是BG。
Culture
也是相同的。
唯一的区别是lang.Handle
类型的IntPtr
。
我想我必须使用句柄P /调用一些win32 API来获得该显示名称。
有什么想法吗?
编辑:
在powershell中执行Get-WinUserLanguageList
会显示以下内容
LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False
LanguageTag : bg
Autonym : български
EnglishName : Bulgarian
LocalizedName : Bulgarian
ScriptName : Cyrillic
InputMethodTips : {0402:00040402, 0402:00030402}
Spellchecking : True
Handwriting : False
输入法提示是这里的关键。
0402:00040402是BG,而0402:00030402是BGPT
答案 0 :(得分:3)
如果PowerShell具有所需的功能,则始终可以从那里获得。添加对C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ WindowsPowerShell \ 3.0 \ System.Management.Automation.dll和C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.InternationalSettings.Commands \ v4的引用。 0_3.0.0.0__31bf3856ad364e35 \ Microsoft.InternationalSettings.Commands.dll
class Program
{
static void Main(string[] args)
{
System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create();
List<Microsoft.InternationalSettings.Commands.WinUserLanguage> userLangList = ps.AddCommand("Get-WinUserLanguageList").Invoke()[0].BaseObject as List<Microsoft.InternationalSettings.Commands.WinUserLanguage>;
foreach (Microsoft.InternationalSettings.Commands.WinUserLanguage userLang in userLangList)
{
Console.WriteLine("{0,-31}{1,-47}", "Antonym", userLang.Autonym);
Console.WriteLine("{0,-31}{1,-47}", "EnglishName", userLang.EnglishName);
Console.WriteLine("{0,-31}{1,-47}", "Handwriting", userLang.Handwriting);
Console.WriteLine("{0,-31}{1,-47}", "InputMethodTips", String.Join(",", userLang.InputMethodTips));
Console.WriteLine("{0,-31}{1,-47}", "LanguageTag", userLang.LanguageTag);
Console.WriteLine("{0,-31}{1,-47}", "LocalizedName", userLang.LocalizedName);
Console.WriteLine("{0,-31}{1,-47}", "ScriptName", userLang.ScriptName);
Console.WriteLine("{0,-31}{1,-47}", "Spellchecking", userLang.Spellchecking);
Console.WriteLine();
}
}
}
或者,Microsoft从注册表中获得了很多此类信息,您可以执行相同的操作:
class Program
{
static void Main(string[] args)
{
(new System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted)).Assert();
Microsoft.Win32.RegistryKey rkLanguages = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel\\International\\User Profile");
foreach (string str in rkLanguages.GetSubKeyNames())
{
Console.WriteLine(str);
Microsoft.Win32.RegistryKey rkLang = rkLanguages.OpenSubKey(str);
foreach (string value in rkLang.GetValueNames())
{
if (rkLang.GetValueKind(value) == Microsoft.Win32.RegistryValueKind.DWord)
{
string blah = String.Concat("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\", value.Split(new char[] { ':' })[1]);
Microsoft.Win32.RegistryKey rkKeyboardLayout = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(blah);
Console.WriteLine(rkKeyboardLayout.GetValue("Layout Text"));
}
}
Console.WriteLine();
}
System.Security.CodeAccessPermission.RevertAssert();
}
}