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
相关产品推荐
相关产品推荐

