Skip to content

Commit 1297afc

Browse files
Thom YorkeThom Yorke
authored andcommitted
🐛 Fix: Remove unreliable coordinate check, rely solely on AX API for Dock detection
1 parent 73605ab commit 1297afc

1 file changed

Lines changed: 9 additions & 10 deletions

File tree

main.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

334337
func 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

Comments
 (0)