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

C#中如何将1x类扫描码作为参数传入SendInput函数

报错原因与修复方案

1. 语法错误修复

你遇到的The name x38 does not exist in the current context报错是十六进制字面量写法错误导致的:
C# 中十六进制数值的合法前缀为 0x,你看到的1x38是扫描码的硬件标注格式,直接写1x38会被编译器识别为「数字1 + 变量x38」,自然会报变量不存在的错误。
你需要的1x38对应扫描码在代码中写为 0x138 即可,编译器会自动将其解析为合法的ushort类型值(对应十进制312)。

2. SendInput 扫描码传参正确写法

使用扫描码模式调用SendInput时,需要按如下规则构造INPUT结构:

  • type 字段赋值为 INPUT_KEYBOARD(值为1)
  • ki.wScan 字段直接赋值为对应的扫描码值
  • ki.dwFlags 必须开启 KEYEVENTF_SCANCODE(值为0x0008)标记,告知系统使用扫描码而非虚拟键码
  • 你的RALT属于扩展扫描码,需要额外开启 KEYEVENTF_EXTENDEDKEY(值为0x0001)标记

示例代码

// 常量定义
const int INPUT_KEYBOARD = 1;
const uint KEYEVENTF_SCANCODE = 0x0008;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
const uint KEYEVENTF_KEYUP = 0x0002;
// Bootcamp下RALT对应扫描码
const ushort RALT_SCANCODE = 0x138;

// 构造INPUT结构(需提前定义好INPUT、KEYBDINPUT结构体的互操作声明)
INPUT keyDownInput = new INPUT();
keyDownInput.type = INPUT_KEYBOARD;
keyDownInput.ki.wScan = RALT_SCANCODE;
keyDownInput.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY;

// 发送RALT按下
SendInput(1, ref keyDownInput, Marshal.SizeOf(typeof(INPUT)));

// 此处插入其他组合键的按下、抬起逻辑

// 发送RALT抬起
INPUT keyUpInput = keyDownInput;
keyUpInput.ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(1, ref keyUpInput, Marshal.SizeOf(typeof(INPUT)));

3. 可选适配方案

如果传入0x138后仍然触发LCtrl+RAlt的组合效果,可以尝试替换为Windows标准右Alt扫描码0xE038,适配通用扫描码规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:00