hs.timer.doAfter(0.3, function() if frontApp then frontApp:activate(true) end local currentMousePos = hs.mouse.getAbsolutePosition() ifmath.abs(currentMousePos.x - originalMousePos.x) < 5andmath.abs(currentMousePos.y - originalMousePos.y) < 5then hs.mouse.setAbsolutePosition(originalMousePos) end end) end)
locallog = hs.logger.new("🔊 播放键", "info") local quarkAppName = "夸克网盘"
-- 全局变量,防止 GC tap = nil local lastTriggered = 0
localfunctionisFrontmostAppQuark() local frontApp = hs.application.frontmostApplication() ifnot frontApp thenreturnfalseend local name = frontApp:name() ifnot name thenreturnfalseend return name == quarkAppName end
local lastFocusedWindow = nil local lastMousePos = nil
localfunctionsendSpaceToQuark() local now = hs.timer.secondsSinceEpoch() if now - lastTriggered < 1.5then log.i("⚠️ 操作过于频繁,忽略本次触发") return end lastTriggered = now
local frontApp = hs.application.frontmostApplication() log.i("当前前台应用: " .. (frontApp and frontApp:name() or"未知"))
hs.timer.doAfter(tryInterval, function() local quarkWindows = quarkApp:visibleWindows() if #quarkWindows > 0then log.i("聚焦 '" .. quarkAppName .. "' 可见窗口") quarkWindows[1]:focus() else log.w("⚠️ '" .. quarkAppName .. "' 无可见窗口") end
if isFrontmostAppQuark() then log.i("✅ 成功切换焦点到 '" .. quarkAppName .. "',发送空格键") hs.eventtap.keyStroke({}, "space") hs.timer.doAfter(0.05, function() hs.eventtap.keyStroke({}, "space") log.i("⬇️ 空格键发送 x2") hs.timer.doAfter(0.2, function() if lastFocusedWindow and lastFocusedWindow:application() then log.i("🔄 尝试恢复焦点到原应用") local newMousePos = hs.mouse.absolutePosition() if newMousePos.x == lastMousePos.x and newMousePos.y == lastMousePos.y then local app = lastFocusedWindow:application() app:activate(true) hs.timer.doAfter(0.1, function() if lastFocusedWindow:isVisible() then lastFocusedWindow:focus() log.i("✅ 焦点已恢复") else log.w("⚠️ 原窗口不可见") end end) else log.i("🖱️ 鼠标移动过,未恢复焦点") end else log.w("⚠️ 无原焦点窗口") end end) end) else if tryCount < maxTries then log.w("⚠️ 焦点切换失败,第 " .. tryCount .. " 次," .. tryInterval .. " 秒后重试") hs.timer.doAfter(tryInterval, tryActivate) else log.e("❌ 多次尝试切换焦点失败,放弃") end end end) end
tryActivate() end
localfunctionbuildTap() return hs.eventtap.new({ hs.eventtap.event.types.systemDefined }, function(event) local data = event:systemKey() if data then log.i("检测系统键: key=" .. tostring(data.key) .. ", down=" .. tostring(data.down)) if data.key == "PLAY"then log.i("🎬 捕获播放键") sendSpaceToQuark() returntrue end end returnfalse end, { allowBubbles = true }) end
tap = buildTap() tap:start()
-- 每分钟检查 tap 是否正常运行,否则重建 hs.timer.doEvery(60, function() ifnot tap:isRunning() then log.w("⚠️ tap 未运行,尝试重建") if tap then tap:stop() end tap = buildTap() tap:start() log.i("🔄 已重建 tap 监听器") end end)
locallog = hs.logger.new("🔊 播放键", "info") local quarkAppName = "夸克网盘"
-- 全局变量,防止 GC tap = nil local lastTriggered = 0
localfunctionisFrontmostAppQuark() local frontApp = hs.application.frontmostApplication() ifnot frontApp thenreturnfalseend local name = frontApp:name() ifnot name thenreturnfalseend return name == quarkAppName end
local lastFocusedWindow = nil local lastMousePos = nil
localfunctionsendSpaceToQuark() local now = hs.timer.secondsSinceEpoch() if now - lastTriggered < 1.5then log.i("⚠️ 操作过于频繁,忽略本次触发") return end lastTriggered = now
local frontApp = hs.application.frontmostApplication() log.i("当前前台应用: " .. (frontApp and frontApp:name() or"未知"))
hs.timer.doAfter(tryInterval, function() local quarkWindows = quarkApp:visibleWindows() if #quarkWindows > 0then -- 优先寻找标题包含“视频”字样的窗口 local targetWindow = nil for _, win inipairs(quarkWindows) do local title = win:title() or"" log.i("检查窗口标题: " .. title) if title:match("视频") or title:match("播放") or title:match("%.mp4") then targetWindow = win break end end if targetWindow then log.i("🎯 选择播放窗口: " .. (targetWindow:title() or"无标题")) targetWindow:focus() else log.w("⚠️ 未找到播放窗口,聚焦第一个窗口") quarkWindows[1]:focus() end else log.w("⚠️ '" .. quarkAppName .. "' 无可见窗口") end
if isFrontmostAppQuark() then log.i("✅ 成功切换焦点到 '" .. quarkAppName .. "',发送空格键") hs.eventtap.keyStroke({}, "space") hs.timer.doAfter(0.05, function() hs.eventtap.keyStroke({}, "space") log.i("⬇️ 空格键发送 x2") hs.timer.doAfter(0.2, function() if lastFocusedWindow and lastFocusedWindow:application() then log.i("🔄 尝试恢复焦点到原应用") local newMousePos = hs.mouse.absolutePosition() if newMousePos.x == lastMousePos.x and newMousePos.y == lastMousePos.y then local app = lastFocusedWindow:application() app:activate(true) hs.timer.doAfter(0.1, function() if lastFocusedWindow:isVisible() then lastFocusedWindow:focus() log.i("✅ 焦点已恢复") else log.w("⚠️ 原窗口不可见") end end) else log.i("🖱️ 鼠标移动过,未恢复焦点") end else log.w("⚠️ 无原焦点窗口") end end) end) else if tryCount < maxTries then log.w("⚠️ 焦点切换失败,第 " .. tryCount .. " 次," .. tryInterval .. " 秒后重试") hs.timer.doAfter(tryInterval, tryActivate) else log.e("❌ 多次尝试切换焦点失败,放弃") end end end) end
tryActivate() end
localfunctionbuildTap() return hs.eventtap.new({ hs.eventtap.event.types.systemDefined }, function(event) local data = event:systemKey() if data then log.i("检测系统键: key=" .. tostring(data.key) .. ", down=" .. tostring(data.down)) if data.key == "PLAY"then log.i("🎬 捕获播放键") sendSpaceToQuark() returntrue end end returnfalse end, { allowBubbles = true }) end
tap = buildTap() tap:start()
-- 每分钟检查 tap 是否正常运行,否则重建 hs.timer.doEvery(60, function() ifnot tap:isRunning() then log.w("⚠️ tap 未运行,尝试重建") if tap then tap:stop() end tap = buildTap() tap:start() log.i("🔄 已重建 tap 监听器") end end)