Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 改变母语';拾取图标';对话窗口?_C#_.net_Vb.net_Winapi_Dialog - Fatal编程技术网

C# 改变母语';拾取图标';对话窗口?

C# 改变母语';拾取图标';对话窗口?,c#,.net,vb.net,winapi,dialog,C#,.net,Vb.net,Winapi,Dialog,在下面屏幕截图的(开源)应用程序中,我调用函数来显示一个对话框窗口,以查看和选择一个图标: 我只是想知道是否有可能改变当前正在运行的进程显示对话框窗口的语言 我检查了该选项,它可以很好地更改常用文件和文件夹对话框的语言,但不会影响“拾取图标”对话框。我可以更改“拾取图标”对话框的语言,代码如下: #include <windows.h> #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") int main(vo

在下面屏幕截图的(开源)应用程序中,我调用函数来显示一个对话框窗口,以查看和选择一个图标:

我只是想知道是否有可能改变当前正在运行的进程显示对话框窗口的语言


我检查了该选项,它可以很好地更改常用文件和文件夹对话框的语言,但不会影响“拾取图标”对话框。

我可以更改“拾取图标”对话框的语言,代码如下:

#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);
}
语言可以设置为ISO名称数组:
(按照提供的顺序,系统中可用的第一种语言将用作对话语言)

或者使用
线程.CurrentThread.CurrentCulture
(或者
CurrentUICulture
):

或者使用特定区域性(使用
CultureInfo.CreateSpecificCulture()
):

VB.Net版本

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);
}
Public Enum MUIFlags As UInteger
MUI_语言_ID=&H4
MUI_语言_名称=&H8
结束枚举
Friend类NativeMethods
好友共享函数SetProcessPreferredUILanguages(dwFlags作为MUIFlags,
PWSZ语言缓冲作为字符串,ByRef pulNumLanguages作为UInteger)作为布尔值
端函数
友元共享函数PickIconDlg(hwnd作为IntPtr,pszIconPath作为String,cchIconPath作为UInteger,ByRef piIconIndex作为Integer)作为整数
端函数
末级

Dim语言作为字符串()
Dim langs As String=String.Join(vbNullChar,LANGNAME)
尺寸单位为UInteger=0
Dim结果为Boolean=NativeMethods.SetProcessPreferredUILanguages(MUIFlags.MUI_LANGUAGE_NAME,
朗格,努姆朗格)
Dim IConPath为String=Path.Combine(Environment.SystemDirectory,“shell32.dll”)
Dim selIcon为整数=-1
如果PickIconDlg(IntPtr.Zero、iconpath、CUInt(iconpath.Length)、selIcon)>0,则
'selIcon设置为所选图标的索引
如果结束
此处提供了
SetProcessPreferredUILanguages
GetProcessPreferredUILanguages
的完整实现,包括声明和包装方法:


为什么不创建自己的对话框,加载自己的徽标,使用自己喜欢的语言?@Aousaf rashid感谢您的评论。原因很简单,如果Windows已经实现,并且提供了一种显示对话框窗口的方法,让最终用户可以查看和选择资源文件中包含的图标,那么为什么不使用它呢?。我不想重新发明轮子。此外,如果您在web上搜索,您会注意到现有的.NET开源算法/库用于管理资源文件中的图标(以这种方式)非常繁琐且不完善(存在bug)。我认为让Windows只需调用pickicondleg的函数就可以做到这一点;SendMessage([Handle],WM_SETTEXT,0,newText)。唯一的问题是,这些窗口具有所有的
32770
类名。当它使用UI Automation打开时,您可以捕获它,设置为。或者,由于您可以决定
Edit
控件中显示的路径,因此可以捕获
WindowOpened
事件,然后检查子树中第一个
Edit
子级,该子级的文本与您刚才设置的路径相同。这个方法可以实现,这是我想到的最简单的事情。通过UI自动化,您可以轻松(足够)做到这一点。否则,您将不得不或。我不知道还有什么方法可以改变默认的系统语言。这不是一个.Net托管类。是的,它确实可以工作(在注释中,我假设OP测试了它)。根据系统中实际可用的语言,按照相同的顺序从提供的语言中选择语言。你介意发布等效的C#和VB.Net版本吗(或者我可以编辑你的答案,如果你不介意的话)?。SetProcessPreferredUILanguages可以很好地工作,正如我在这个问题的主要帖子中所指定的那样,它会改变例如OpenFileDialog的语言,但我也指定了它不会影响“拾取图标”对话框的语言。也许这是因为正如你提到的,用户可能需要安装语言包,而我还没有安装。我将接受这个答案,假设事实是真实的,并且一旦安装了lang pack,它将在调用SetProcessPreferredUILanguages时正确地替换“Pick Icon”对话框的语言。谢谢你的帮助。
string[] languages = new[] { "de-DE", "en-US", "it-IT", "es-ES", "fr-FR" };
string[] languages = new[] { Thread.CurrentThread.CurrentUICulture.Name };
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
}