Я могу изменить язык в диалоговом окне «Pick Icon» с простым кодом, приведенным ниже:
#include <windows.h>
#include <Shlobj.h>
#pragma comment(lib, "Shell32.lib")
int main(void)
{
ULONG n;
WCHAR s[] = L"C:\\Windows\\Explorer.exe";
int i = 1;
n = 1;
WCHAR langs[] = L"zh-CN\0";
BOOL ret = SetProcessPreferredUILanguages(MUI_LANGUAGE_NAME, langs, &n);
PickIconDlg(NULL,s, wcslen(s)+1,&i);
}
Результат: (Обратите внимание, что языком по умолчанию в Моей среде является «en-US»)
Похоже, вам нужно сначала установить языковой пакет.Настройки> Время и язык> Язык> Добавить предпочитаемый язык, затем выберите язык, который вы добавили, и перейдите в Параметры, установите языковой пакет.
C # версия :
public enum MUIFlags : uint
{
MUI_LANGUAGE_ID = 0x4,
MUI_LANGUAGE_NAME = 0x8,
}
[SuppressUnmanagedCodeSecurity, SecurityCritical]
internal static class NativeMethods
{
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool SetProcessPreferredUILanguages(MUIFlags dwFlags,
string pwszLanguagesBuffer, ref uint pulNumLanguages);
[DllImport("Shell32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern int PickIconDlg(IntPtr hwnd, string pszIconPath,
uint cchIconPath, ref int piIconIndex);
}
Языки могут быть установлены в виде массива имен ISO:
(Первый язык, доступный в Системе, в указанном порядке будет использоваться в качестве языка диалога).
string[] languages = new[] { "de-DE", "en-US", "it-IT", "es-ES", "fr-FR" };
Или используя Thread.CurrentThread.CurrentCulture
(или CurrentUICulture
):
string[] languages = new[] { Thread.CurrentThread.CurrentUICulture.Name };
Или используя определенную культуру (используя CultureInfo.CreateSpecificCulture()
):
string[] languages = new[] { CultureInfo.CreateSpecificCulture("en-US").Name };
uint numLangs = 0;
string langs = string.Join("\u0000", languages);
bool result = NativeMethods.SetProcessPreferredUILanguages(MUIFlags.MUI_LANGUAGE_NAME,
languages, ref numLangs);
string iconsPath = Path.Combine(Environment.SystemDirectory, "shell32.dll");
int selIcon = -1;
if (PickIconDlg(IntPtr.Zero, iconsPath, (uint)iconsPath.Length, ref selIcon) > 0)
{
// selIcon is set to the selected Icon's index
}
VB.Net версия :
Public Enum MUIFlags As UInteger
MUI_LANGUAGE_ID = &H4
MUI_LANGUAGE_NAME = &H8
End Enum
<SuppressUnmanagedCodeSecurity, SecurityCritical>
Friend Class NativeMethods
<DllImport("Kernel32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Friend Shared Function SetProcessPreferredUILanguages(dwFlags As MUIFlags,
pwszLanguagesBuffer As String, ByRef pulNumLanguages As UInteger) As Boolean
End Function
<DllImport("Shell32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Friend Shared Function PickIconDlg(hwnd As IntPtr, pszIconPath As String, cchIconPath As UInteger, ByRef piIconIndex As Integer) As Integer
End Function
End Class
Dim languages As String() = {"es-ES", "fr-FR", "en-US"}
Dim langs As String = String.Join(vbNullChar, langNames)
Dim numLangs As UInteger = 0
Dim result As Boolean = NativeMethods.SetProcessPreferredUILanguages(MUIFlags.MUI_LANGUAGE_NAME,
langs, numLangs)
Dim iconsPath As String = Path.Combine(Environment.SystemDirectory, "shell32.dll")
Dim selIcon As Integer = -1
If PickIconDlg(IntPtr.Zero, iconsPath, CUInt(iconsPath.Length), selIcon) > 0 Then
' selIcon is set to the selected Icon's index
End If
Полная реализация SetProcessPreferredUILanguages
, GetProcessPreferredUILanguages
, включая объявления и оболочкуметоды, доступно здесь:
Не удается прочитать все имена языков, возвращаемые функцией GetProcessPreferredUILanguages