因为非修饰符操作是在按键事件上执行的。

因为非修饰符操作是在按键事件上执行的。

按住Ctrl它。然后,Alt按住它。最后,按Delete。如果您有 Ubuntu 系统(可能是任何基于 Debian 的系统),您的会话很可能会被锁定,因为您执行了Ctrl+ Alt+Delete快捷方式。

现在,Delete按住它。然后Ctrl按住它。然后,按Alt。锁定会话快捷方式不会被触发

为什么会这样呢?此设置硬编码在哪里?

我的猜测:我的印象是快捷方式实际上是通过“扩展键盘按键”来工作的。因此,选择CtrlAlt打开一个“新键盘”,其中您选择了键Delete。但是Delete,当您首先选择属于物理键盘而不属于该虚拟扩展键盘时,情况就不一样了。是这样吗?

答案1

因为非修饰符操作是在按键事件上执行的。

这实际上与键盘硬件几乎无关。 USB 和 PS/2 键盘在这方面的操作相同。有没有什么在使所谓的“修饰键”变得特殊的硬件中。 任何键,除了一个例外,可以是修饰键,也可以不是。

决定什么是修饰键的是键盘图用于操作系统中的软件。硬件仅发送有效的事件(掩盖 USB HID 输入报告协议的细节,实际上是当前按下的按键的位图,部分编码为由内而外的形式以保持简短)按键按下和按键按下事件。

例如,在 FreeBSD 键盘映射中,可以找到如下行:

# 替代
# 扫描 cntrl alt alt cntrl 锁定
# 代码 基本 移位 cntrl 移位 alt 移位 cntrl 移位状态
#------------------------------------------------- -----------------
……
029 控制 控制 控制 控制 控制 控制 控制 控制 控制 控制 O
……
第042期
……
第054期
……
056 拉特 拉特 拉特 拉特 拉特 拉特 拉特 O
……
第083期'.' '.' '.' '.'引导引导N
……

029、042、054 和 056 是键盘代码(根据 USB HID 使用编号和 PS/2 扫描码编号标准化为通用系统),但它是lctrllshiftrshiftlalt 行动在映射中将这些键定义为修饰键。用不同的操作定义它们并将这些操作移动到其他地方,就像一些开箱即用的 FreeBSD 地图所做的那样,并且完全不同键是修饰符。

(该规则的例外是Fn键,它是在硬件中实现的一个修饰符。它是实现的完全在硬件中,软件看不到根本不。它甚至不会通过线路生成任何事件。实际上还有另一个硬件修改器。这不是钥匙。这是 NumLock LED 的状态。)

行动,当它是这样的修饰符操作时,会更改当前修改器状态,(简单地说)是操作系统中记录的一组标志,用于记录当前“打开”的修饰符。正如您从键盘映射中的列标题中看到的,当前修饰符状态(就“shift”、“altgr”、“control”和“alt”状态的“on”标志而言)影响什么行动进一步的按键映射到。

在键代码 083 的行(即刻. del在数字键盘上的键代码)上,您可以看到,只有当当前修改器状态至少为“alt cntrl”时,映射的操作才会为boot

键盘驱动程序制定修改动作收到钥匙后或钥匙发布事件。其他操作仅在关键事件上生效或者自动重复事件。boot例如,该动作就是这种情况。仅当按键 083 发生按键或自动重复事件时当前修改器状态已经是“alt cntrl”/“alt cntrl shift”,该boot操作是否发生。

由此可见,为了首先使操作系统的当前修饰符状态进入该状态,laltand lctrl/rctrl操作必须具有已经发生了, 经过第一的按恰好映射到它们的键。 (FreeBSD 的系统还允许修饰符除了通常的修饰符系统之外转变,尽管只有两个开箱即用的键盘映射可以使用它们。 ISO 键盘标准还允许修饰符闩锁,但FreeBSD不提供这种机制。)

正如我所说,FreeBSD 就是一个例子。但大多数带有 PS/2 或 USB HID 设备的操作系统,从 MS/PC-DOS(其中当前修饰符状态是内存中的众所周知的字节)到 Windows NT(其中键盘映射是包含代码和数据的内核模式 DLL) ),大致按照这样的方式工作。

进一步阅读

答案2

就像按a然后Shift不会给您一个 一样A,按Delete之前AltCtrl不会发送正确的键代码。

需要在修改键之前按下修改键。此实例中的修饰键是 且Alt不是修饰键。CtrlDelete

如果允许在geta之前按下,则读取按键的软件将无法输出任何字符,直到键入下一个字符。ShiftA

键盘硬件根据按下的键是否带有活动修饰符来发送不同的扫描代码。

相关内容