hammerspoon 是如何当我当个合格的舔狗的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jassssper
V2EX    Apple

hammerpoon 是如何当我当个合格的舔狗的

  •  
  •   jassssper 11 天前 1473 次点击

    1 、痛点: 在 mac 上聊天的时候 iPhone 手机就一直咚咚的响好烦,如果点击顶部把 ”mac 已登录手机通知关闭“ 的话,又会忘了开,导致女神的消息无法及时回复,被 diss 不是一个合格的舔狗,emm...

    2 、观察结论: 如果在 mac 上退出微信的话,手机上的 ”mac 已登录手机通知关闭“ 会自动消掉,手机就能收到通知,从而达到无缝衔接的目的。

    3 、解决思路: 使用 hammerspoon 实现如下功能: a.每 30 秒检查一次键盘和鼠标动作,如果 120 秒没有动作就退出 mac 微信(注意不能用 killall ,否则 iPhone 那边不知道 mac 上已经退出了) b.当检测到有鼠标和键盘动作后,立即调起微信登录

    4 、具体方法: a.下载、安装、打开 hammerspoon ( https://www.hammerspoon.org/) b.打开配置文件写入脚本:

    `local idleLimit = 120 -- 120 秒无操作算不活跃 local checkInterval = 30 -- 每 30 秒检查一次 local wechatBundleID = "com.tencent.xinWeChat"

    local timer = nil local enabled = true local lastRunning = nil -- 记录上一次运行状态,避免重复日志

    -- 判断微信是否运行 local function isWeChatRunning() return hs.application.get(wechatBundleID) ~= nil end

    -- 优雅退出微信 local function quitWeChat(reason) local app = hs.application.get(wechatBundleID) if app then app:kill() hs.alert.show(" 自动退出微信") print("WeChat quit (" .. (reason or "idle") .. ") at " .. os.date()) lastRunning = false end end

    -- 启动微信 local function launchWeChat(reason) if not enabled then return end if not isWeChatRunning() then hs.application.launchOrFocusByBundleID(wechatBundleID) hs.alert.show(" 启动微信") print("WeChat launched (" .. (reason or "active") .. ") at " .. os.date()) lastRunning = true end end

    -- 检查是否该退出 local function checkIdle() if not enabled then return end local idleTime = hs.host.idleTime() local running = isWeChatRunning()

    if running ~= lastRunning then print("WeChat running=" .. tostring(running) .. " at " .. os.date()) lastRunning = running end if idleTime > idleLimit and running then quitWeChat("idle") end 

    end

    -- 电源事件监听:休眠时退出微信,唤醒后延迟启动 local sleepWatcher = hs.caffeinate.watcher.new(function(eventType) if eventType == hs.caffeinate.watcher.systemWillSleep then quitWeChat("sleep") elseif eventType == hs.caffeinate.watcher.systemDidWake then hs.timer.doAfter(10, function() launchWeChat("wake") end) elseif eventType == hs.caffeinate.watcher.screensDidSleep then quitWeChat("screens sleep") elseif eventType == hs.caffeinate.watcher.screensDidWake then hs.timer.doAfter(5, function() launchWeChat("screens wake") end) end end) sleepWatcher:start()

    -- 定时器:负责检测是否要退出 if timer then timer:stop() end timer = hs.timer.doEvery(checkInterval, checkIdle)

    -- 事件监听:键盘/鼠标动作 → 立即启动微信 local eventtap = hs.eventtap.new({ hs.eventtap.event.types.keyDown, hs.eventtap.event.types.mouseMoved, hs.eventtap.event.types.leftMouseDown, hs.eventtap.event.types.rightMouseDown }, function(_) launchWeChat("input") return false end) eventtap:start() ` 后记: 1 、在 iPhone 通知栏可设置 1 小时不提醒,今天不提醒,但是这样也是简单粗暴

    2 、微信不像企业微信那样可以设置 5min 10min 无活动就恢复通知

    在 AI 大爆发的时代,他们把东西做成这样我表示很痛心

    9 条回复    2025-09-30 16:24:33 +08:00
    Guino
        1
    Guino  
       11 天前
    换一个不会 diss 你不合格的女神
    jassssper
        2
    jassssper  
    OP
       11 天前
    @Guino #1 换不了一点儿
    kiev84
        3
    kiev84  
       11 天前
    你想表达是「 hammerspoon 是如何帮我当个合格的舔狗的」吧?标题看了半天没看明白。
    huaweii
        4
    huaweii  
       11 天前 via Android
    「女神的消息如果不立刻回复我就会失去女神」,请问你是?
    zhouweiluan
        5
    zhouweiluan  
       11 天前   1
    只能说微信这一点是真的智障,QQ 以及企业微信都能监测到电脑长时间无响应会把消息推送到手机,但微信就死活不搞这个,每次都因为离开电脑去吃午饭而错过无数需要及时响应的消息。
    jassssper
        6
    jassssper  
    OP
       11 天前
    @zhouweiluan #5 试试我上面那个方法就解决啦
    kamikaze472
        7
    kamikaze472  
       11 天前
    手机打开专注模式的工作模式, 微信就不会一直响了
    suitts
        8
    suitts  
       11 天前
    哈哈,我是弄的 mac 锁屏退出微信
    killua67
        9
    killua67  
       11 天前
    我也发现这个问题了,我手机上开了通知,好像只有打开微信界面的时候手机会响,锁屏了不会响,不知道是不是戴了手表的原因 就不推送手机了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     885 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:46 PVG 03:46 LAX 12:46 JFK 15:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86