Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions Sources/KeyMonitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,14 @@ class KeyMonitor {
triggerConfig = .current
logger.info("触发键: \(self.triggerConfig.displayName, privacy: .public)")

// Use .listenOnly — we only observe the trigger key, never block/modify
// events. An active (.defaultTap) filter serialises every keystroke
// through our callback, which stalls typing system-wide whenever the
// main thread has any latency.
guard let tap = CGEvent.tapCreate(
tap: .cgSessionEventTap,
place: .headInsertEventTap,
options: .defaultTap,
options: .listenOnly,
eventsOfInterest: eventMask,
callback: { (proxy, type, event, refcon) -> Unmanaged<CGEvent>? in
guard let refcon = refcon else {
Expand Down Expand Up @@ -191,18 +195,13 @@ class KeyMonitor {
DispatchQueue.main.async {
Comment thread
claude[bot] marked this conversation as resolved.
self.onKeyRecorded?(config)
}
return nil // 吞掉录制的按键事件
}
return Unmanaged.passRetained(event)
}

// 正常触发键检测模式
if let pressed = triggerConfig.matches(type: type, event: event) {
handleTriggerState(pressed: pressed)
// 非修饰键需要吞掉事件,防止触发系统默认行为
if !triggerConfig.isModifierKey {
return nil
}
}

return Unmanaged.passRetained(event)
Expand Down
Loading