@@ -117,14 +117,17 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
117117 HotkeyManager . shared. registerHotkey ( )
118118 setupEventTap ( )
119119
120- // 允许 App Nap - 热键事件会自动唤醒应用,无需禁用
120+ // 防止 App Nap (关键修复)
121+ //由于 EventTap 需要实时响应(否则会被系统判定超时而禁用),必须禁止 App Nap
122+ ProcessInfo . processInfo. beginActivity ( options: . userInitiated, reason: " Global Event Listener " )
123+
121124 // 睡眠/唤醒监听
122125 NSWorkspace . shared. notificationCenter. addObserver ( self , selector: #selector( didWake) , name: NSWorkspace . didWakeNotification, object: nil )
123126 }
124127
125128 @objc func didWake( ) {
126129 print ( " System Woke Up: Resetting Event Tap... " )
127- // Re-initialize event tap after a short delay to ensure system is ready
130+ // 延迟重置,给系统一点缓冲时间
128131 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 2.0 ) {
129132 self . setupEventTap ( )
130133 }
@@ -332,9 +335,8 @@ func minimizeAppWindows(_ appRef: AXUIElement) {
332335}
333336
334337func eventTapCallback( proxy: CGEventTapProxy , type: CGEventType , event: CGEvent , refcon: UnsafeMutableRawPointer ? ) -> Unmanaged < CGEvent > ? {
335- // 处理 tap 被系统禁用的情况
338+ // 处理 tap 被系统禁用的情况(App Nap、超时等)
336339 if type == . tapDisabledByTimeout || type == . tapDisabledByUserInput {
337- // 延迟重建 eventTap(通过主线程)
338340 DispatchQueue . main. async {
339341 if let delegate = NSApp . delegate as? AppDelegate {
340342 delegate. setupEventTap ( )
@@ -343,14 +345,11 @@ func eventTapCallback(proxy: CGEventTapProxy, type: CGEventType, event: CGEvent,
343345 return Unmanaged . passUnretained ( event)
344346 }
345347
346- if type != . leftMouseDown { return Unmanaged . passUnretained ( event) }
348+ guard type == . leftMouseDown else { return Unmanaged . passUnretained ( event) }
347349
348- // 快速检查:点击位置是否在 Dock 区域(屏幕底部 80px)
350+ // 直接使用 Accessibility API 判断点击目标
351+ // 不再做坐标预判断,因为 CGEvent 和 NSScreen 坐标系不同,多屏时极易出错
349352 let location = event. location
350- let screenHeight = NSScreen . main? . frame. height ?? 0
351- if location. y < ( screenHeight - 80 ) { return Unmanaged . passUnretained ( event) }
352-
353- // 仅当点击在 Dock 区域时才进行 AX 查询(减少 CPU 开销)
354353 let systemWide = AXUIElementCreateSystemWide ( )
355354 var element : AXUIElement ?
356355 let result = AXUIElementCopyElementAtPosition ( systemWide, Float ( location. x) , Float ( location. y) , & element)
0 commit comments