You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中模拟按下ALT+SHIFT实现Windows语言切换?

在C#中模拟ALT+SHIFT组合键切换Windows输入法

要实现模拟ALT+SHIFT组合键切换输入法,你之前的尝试存在两个核心问题:一是仅调用了按键按下操作(KeyDown)却未执行释放操作,二是SendKeys的异步发送逻辑可能导致系统未正确识别组合键。以下是两种可靠的实现方案:

方法一:使用SendKeys(WinForms/WPF环境适用)

SendKeys适合带UI界面的应用场景,推荐用SendWait替代Send,确保按键事件被系统同步处理:

// 模拟按下并释放ALT+SHIFT组合键
SendKeys.SendWait("%+");
  • 语法说明:% 代表Alt键,+ 代表Shift键;SendWait会等待按键操作完成后再继续执行后续代码,避免异步导致的识别失败。

方法二:使用Windows API(全局场景/控制台程序适用)

如果需要全局生效或在无UI环境中使用,直接调用Windows的SendInput API是更稳定的选择,它能完整模拟按键按下和释放的全流程:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms; // 需要引用System.Windows.Forms程序集

public static class KeyboardSimulator
{
    [StructLayout(LayoutKind.Sequential)]
    private struct INPUT
    {
        public uint Type;
        public INPUTUNION Data;
    }

    [StructLayout(LayoutKind.Explicit)]
    private struct INPUTUNION
    {
        [FieldOffset(0)]
        public KEYBDINPUT Keyboard;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct KEYBDINPUT
    {
        public ushort Vk;
        public ushort Scan;
        public uint Flags;
        public uint Time;
        public IntPtr ExtraInfo;
    }

    private const uint INPUT_KEYBOARD = 1;
    private const uint KEYEVENTF_KEYUP = 0x0002;

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

    public static void TriggerAltShift()
    {
        var inputs = new INPUT[4];

        // 按下左Alt键
        inputs[0].Type = INPUT_KEYBOARD;
        inputs[0].Data.Keyboard.Vk = (ushort)Keys.LMenu;

        // 按下左Shift键
        inputs[1].Type = INPUT_KEYBOARD;
        inputs[1].Data.Keyboard.Vk = (ushort)Keys.LShiftKey;

        // 释放左Shift键
        inputs[2].Type = INPUT_KEYBOARD;
        inputs[2].Data.Keyboard.Vk = (ushort)Keys.LShiftKey;
        inputs[2].Data.Keyboard.Flags = KEYEVENTF_KEYUP;

        // 释放左Alt键
        inputs[3].Type = INPUT_KEYBOARD;
        inputs[3].Data.Keyboard.Vk = (ushort)Keys.LMenu;
        inputs[3].Data.Keyboard.Flags = KEYEVENTF_KEYUP;

        SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
    }
}

调用方式:

KeyboardSimulator.TriggerAltShift();

注意事项

  • 使用SendKeys时,需确保当前应用窗口处于激活状态,否则组合键可能无法触发输入法切换。
  • 使用SendInput方案时,.NET Core/.NET 5+项目需先安装System.Windows.Forms NuGet包。

内容的提问来源于stack exchange,提问作者Oscar Portorreal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:54:37