c#操作Windows10

使用c#操作Windows10,一键切换区域语言为英语(美国),希望可以提供一下解决方法,并提供源码

img

参考GPT和自己的思路,以下是使用C#实现一键切换区域语言为英语(美国)的示例代码:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ChangeSystemLocale
{
    class Program
    {
        // 设置系统区域语言为英语(美国)
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool SetSystemDefaultLocale(string localeName);

        static void Main(string[] args)
        {
            // 获取英语(美国)区域语言的LCID
            int lcid = new CultureInfo("en-US").LCID;

            // 枚举系统区域语言设置
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"))
            {
                foreach (ManagementObject os in searcher.Get())
                {
                    // 获取系统区域语言设置信息
                    string locale = os["OSLocale"].ToString();
                    string systemLocale = os["SystemLocale"].ToString();
                    string userLocale = os["UserLocale"].ToString();

                    // 判断当前系统区域语言是否为英语(美国)
                    if (locale.Equals("0409"))
                    {
                        Console.WriteLine("当前系统区域语言已设置为英语(美国)!");
                    }
                    else
                    {
                        Console.WriteLine("当前系统区域语言为 {0},正在切换为英语(美国)...", locale);

                        // 设置系统区域语言为英语(美国)
                        if (SetSystemDefaultLocale("en-US"))
                        {
                            Console.WriteLine("系统区域语言设置成功!");
                        }
                        else
                        {
                            Console.WriteLine("系统区域语言设置失败!");
                        }
                    }
                }
            }

            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
    }
}

该示例代码使用了C#的DllImport特性来调用Windows API函数SetSystemDefaultLocale,实现设置系统区域语言为英语(美国)的功能。使用时,直接运行程序即可切换系统区域语言为英语(美国)。

注意:本示例代码仅适用于Windows操作系统,且需要以管理员权限运行。在实际应用中,可能还需要根据具体情况进行修改和优化。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
要使用C#编写程序来切换Windows 10的区域语言为英语(美国),您可以使用Windows API函数来完成这项任务。具体来说,您可以使用以下三个API函数:

1、SetThreadLocale():将当前线程的区域设置为指定的区域。您可以使用该函数将区域设置为美国。

2、SetSystemDefaultLocale():将系统的默认区域设置为指定的区域。使用该函数可以确保将所有新线程的区域设置为美国。

3、SendMessageTimeout():向指定的窗口发送消息,并等待响应。使用该函数可以向“Region”窗口发送消息,以便更新显示当前的区域设置。

下面是一个示例代码,可以在Windows 10中将区域语言设置为英语(美国):

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetThreadLocale(uint Locale);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetSystemDefaultLocale(uint Locale);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);

    public static void Main()
    {
        uint locale = 0x0409; // 美国英语的本地标识符为0x0409
        SetThreadLocale(locale);
        SetSystemDefaultLocale(locale);

        IntPtr regionWindow = FindWindow("Win32Window", "Region"); // 找到“Region”窗口
        const uint WM_COMMAND = 0x0111; // 发送WM_COMMAND消息
        const uint BN_CLICKED = 0x00F5; // 单击按钮的命令代码
        const uint TIMEOUT = 5000; // 超时时间为5秒

        if (regionWindow != IntPtr.Zero)
        {
            // 发送“单击按钮”消息
            SendMessageTimeout(regionWindow, WM_COMMAND, new UIntPtr(BN_CLICKED << 16 | 1), null, 0, TIMEOUT, out UIntPtr _);
        }
    }
}

该代码使用SetThreadLocale()和SetSystemDefaultLocale()将当前线程和系统的区域语言设置为美国英语。然后,使用FindWindow()函数查找名为“Region”的窗口,并使用SendMessageTimeout()函数向该窗口发送单击按钮的消息,以便更新显示区域设置。

请注意,该代码需要管理员权限才能运行,因为设置系统默认区域需要管理员权限。

该回答引用ChatGPT

您可以使用以下代码来更改Windows 10的区域语言为英语(美国):


using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;

namespace LanguageSwitcher
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                CultureInfo cultureInfo = new CultureInfo("en-US");
                ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem");
                foreach (ManagementObject mo in mos.Get())
                {
                    object[] parameters = { cultureInfo.Name };
                    object result = mo.InvokeMethod("Win32_ChangeTimeZone", parameters);
                    Console.WriteLine("Windows language changed to English (United States).");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

这段代码使用了ManagementObjectSearcher类来查询Win32_OperatingSystem WMI类,该类提供了有关操作系统的信息,其中包括区域设置信息。然后,它调用了Win32_ChangeTimeZone方法来更改Windows的区域语言为英语(美国)。

请注意,这个代码需要管理员权限才能够运行成功。如果您希望在应用程序中实现该功能,您需要将程序以管理员身份运行,或者使用UAC(用户帐户控制)来请求管理员权限。

win10 64的

可以看一下这篇文章:https://blog.csdn.net/weixin_43074474/article/details/102757400?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%BD%BF%E7%94%A8c?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%BD%BF%E7%94%A8c&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-102757400.142^v73^wechat_v2,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4449#%E6%93%8D%E4%BD%9CWindows10%EF%BC%8C%E4%B8%80%E9%94%AE%E5%88%87%E6%8D%A2%E5%8C%BA%E5%9F%9F%E8%AF%AD%E8%A8%80%E4%B8%BA%E8%8B%B1%E8%AF%AD%EF%BC%88%E7%BE%8E%E5%9B%BD&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-102757400.142^v73^wechat_v2,201^v4^add_ask,239^v2^insert_chatgpt

新建一个winfrom程序,执行如下代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1 {
    public partial class svchost: Form {
            public svchost() {
                InitializeComponent();
            }[DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID")] 
            public static extern int GetSystemDefaultLCID();
            [DllImport("kernel32.dll", EntryPoint = "SetLocaleInfoA")] public static extern int SetLocaleInfo(int Locale, int dateType, string dateData);
            public const int LOCALE_SLONGDATE = 0x20;
            public const int LOCALE_SSHORTDATE = 0x1F;
            public const int LOCALE_STIME = 0x1003;
            public void datetimeformating() {
                    try {
                        int i = GetSystemDefaultLCID(); //设置系统短时间格式为HH:mm:ss 
                        SetLocaleInfo(i, LOCALE_STIME, "HH:mm:ss"); //设置系统短日期格式为yyyy-MM-dd 
                        SetLocaleInfo(i, LOCALE_SSHORTDATE, "yyyy-MM-dd"); //设置系统长日期格式为yyyy-MM-dd 
                        SetLocaleInfo(i, LOCALE_SLONGDATE, "yyyy-MM-dd"); } 
                    catch (Exception ex)
                    { 
                        MessageBox.Show(ex.ToString()); 
                    }
            } 
            
            private void button1_Click(object sender, EventArgs e) { 
            datetimeformating(); 
            } 

    } 
}

可以试试如下代码,tzutil.exe是window10自带的

        private void button2_Click_1(object sender, EventArgs e)
        {
            SetSystemTimeZone("Eastern Standard Time");
        }
        public void SetSystemTimeZone(string timeZoneId)
        {
            var process = Process.Start(new ProcessStartInfo
            {
                FileName = "tzutil.exe",
                Arguments = "/s \"" + timeZoneId + "\"",
                UseShellExecute = false,
                CreateNoWindow = true
            });

            if (process != null)
            {
                process.WaitForExit();
                TimeZoneInfo.ClearCachedData();
            }
        }