更改系统语言 C#

10

我正在编写一个应用程序,需要在应用程序未聚焦时更改系统语言。我担心唯一的方法是使用 Windows 钩子,但我目前无法完全理解它。

你有什么想法吗?


你的意思是特定的应用程序需要将系统语言更改为用户通常不使用的语言吗? - Eric J.
问题是你知道自己没有专注,还是改变系统语言? - Jon B
更改语言需要登录/注销...您是指语言输入吗? - vcsjones
问题是将当前系统语言更改为其他语言。 - Tzah Mama
3个回答

2

我认为,相比于更改Windows设置,通过映射另一个键盘布局并“翻译”输入会更容易,尤其是在没有用户同意的情况下。

在我完成回答之前,ahmadali shafiee发布了我想到的代码。优雅地使用它吧。


1

原帖作者自己提供的解决方案,最初是问题的一部分,但已被编辑删除:

[DllImport("user32.dll")]
private static extern bool PostMessage(int hhwnd, uint msg, IntPtr wparam, IntPtr lparam);

[DllImport("user32.dll")]
private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);

private static uint WM_INPUTLANGCHANGEREQUEST = 0x0050;
private static int HWND_BROADCAST = 0xffff;
private static string en_US = "00000409";
private static uint KLF_ACTIVATE = 1;

private static void ChangeLanguage()
{
    PostMessage(HWND_BROADCAST,WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero ,LoadKeyboardLayout(en_US,KLF_ACTIVATE));
}

1

要更改输入语言,您可以使用以下代码:

private void ChangeKeboardLayout(System.Globalization.CultureInfo CultureInfo)
    {
        InputLanguage c = InputLanguage.FromCulture(CultureInfo);
        InputLanguage.CurrentInputLanguage = c;
    }

而且只要你的应用程序(或线程)处于打开状态,你就可以随时执行它。


这并没有帮助,因为这段代码会改变当前线程的输入语言。我正在寻找一种可以在焦点不在应用程序的情况下更改系统输入语言的方法(就像用户按下alt+shift键一样)。 - Tzah Mama
如果你的线程是打开状态,那么你可以这样做。表单焦点状态不会改变任何东西。 - ahmadali shafiee
这可能是我的问题,我没有表达清楚,我需要更改语言输入的不是在我的应用程序中,而是在当前打开的窗口中。比如说,我现在正在记事本中输入俄语,然后我想让应用程序将其更改为英语。 - Tzah Mama
@user1459484 我不太明白。我想你的意思是当你的表单“失去焦点”时想要更改输入语言。你是这个意思吗? - ahmadali shafiee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接