Изменить язык родного диалогового окна «Pick Icon»? - PullRequest
1 голос
/ 06 июня 2019

В приложении (с открытым исходным кодом) на снимке экрана ниже я вызываю функцию PickIconDlg , чтобы отобразить диалоговое окно для просмотра и выбрать значок:

Я просто хотел бы знать, существует ли возможность изменить язык, на котором отображается это диалоговое окно для текущего запущенного процесса.

Я проверил, что SetProcessPreferredUILanguages ​​ отлично работает для изменения языка общих диалоговых окон файлов и папок, но это не влияет на диалоговое окно «Pick Icon».

1 Ответ

2 голосов
/ 06 июня 2019

Я могу изменить язык в диалоговом окне «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») enter image description here

Похоже, вам нужно сначала установить языковой пакет.Настройки> Время и язык> Язык> Добавить предпочитаемый язык, затем выберите язык, который вы добавили, и перейдите в Параметры, установите языковой пакет.

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 ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...