1

按“Command +”会导致两个 -performKeyEquivalent 调用。这是第一次调用的堆栈跟踪片段:

1   AppKit                              0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
2   AppKit                              0x00007fff903da442 -[NSView performKeyEquivalent:] + 166
3   AppKit                              0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
4   AppKit                              0x00007fff903da259 -[NSWindow performKeyEquivalent:] + 64
5   AppKit                              0x00007fff903da044 -[NSApplication _handleKeyEquivalent:] + 462
6   AppKit                              0x00007fff90297173 -[NSApplication sendEvent:] + 4480

对于第二个电话:

1   AppKit                              0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
2   AppKit                              0x00007fff903da442 -[NSView performKeyEquivalent:] + 166
3   AppKit                              0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
4   AppKit                              0x00007fff903da259 -[NSWindow performKeyEquivalent:] + 64
5   AppKit                              0x00007fff903da044 -[NSApplication _handleKeyEquivalent:] + 462
6   AppKit                              0x00007fff900e3927 -[NSApplication _handleSpecialAlternateKeyEquivalent:] + 656
7   AppKit                              0x00007fff9029718e -[NSApplication sendEvent:] + 4507

如您所见,第二个 -performKeyEquivalent 调用由 -[NSApplication _handleSpecialAlternateKeyEquivalent:] 发起。那么,谁能告诉我“Command +”击键有什么特别之处,它保证不是一个,而是两个 -performKeyEquivalent 调用,以及如何过滤掉第二个调用?

4

2 回答 2

1

最可能的原因是第一个调用返回NO,因此 AppKit 再次尝试使用稍微不同的事件。你压倒一切performKeyEquivalent:吗?你NO是第一次回来吗?


Cocoa 事件处理指南中的注释:处理关键事件:

不鼓励 NSWindow 子类重写 performKeyEquivalent:。

注意:从 OS X v10.5 开始,如果无法识别等效键,NSWindow 会将其作为 NSKeyDown 事件发送给第一响应者。此行为启用带有命令键修饰符的自定义键绑定条目。此外,NSApplication 通过 performKeyEquivalent: 向键窗口发送一个 Control-key 事件,然后通过响应者链将其作为 NSKeyDown 事件发送。此行为允许更可靠地使用 Control 键事件作为菜单键等效项。

于 2013-08-23T14:01:49.960 回答
1

我知道这是一个非常古老的线程,但是当我进行搜索时我一直遇到它,最近看到了一些与此相关的旧代码。

这看起来像是苹果公司的黑客行为。某种放大或放大功能通常使用快捷键 Cmd +。在美国键盘(和许多其他键盘)上,用户希望它在按下 Cmd = 时工作,因为加号也在那个键上。因此,Apple 首先发送 Cmd =,然后如果没有得到响应,则发送 Cmd +。我没有对此进行详细测试,但似乎只有在 = 和 + 共享相同的键并且 + 是移位字符时才会这样做。例如,如果您在数字键盘上按 Cmd =,它将不会执行此操作。这使得过滤变得困难,你不能假设 Cmd = 后面会跟着一个你可以丢弃的 Cmd + 。

Cmd+Period 也会发生这种情况。Apple 首先发送 Cmd+Period,然后发送 Cmd+Escape。根据我正在查看的源代码,这是发生这种情况的仅有的两种情况。

更新:第二个事件不等于,NSApp.currentEvent因为它不是通过正常的调度机制发送的。这似乎是过滤掉它的一种方法。

于 2021-12-19T21:57:18.400 回答