备注: 此文章可能并不能很好地解决问题,推荐看更新的文章(修复某些游戏在macOS上的全屏相关缺陷)
前前言
本人技术又提高了一丢丢,已经会用更优雅更好地方式(通过 System Events 接口)来控制dock栏状态(而不是用defaults这种方式),可惜的是菜单栏依然不支持通过 System Events 接口来控制.目前代码有优化的空间(操作也能更优雅一些,还可以考虑写个GUI),但我懒+没空(先搁置),以后再优化.
前言
在macOS玩全屏(16:10比例,不是无边框)非纯原生游戏过程中遇到一个(其实后面更新说明还遇到一个)很难受的问题,在游戏将鼠标指针移动到屏幕上方菜单栏区域并点击后,鼠标指针会立刻出现并显示为macOS系统的鼠标指针,严重影响游戏体验。例如在通过CrossOver运行的Palworld(幻兽帕鲁),部分原生的League of Legends(英雄联盟)等游戏。本文主要通过一些曲线办法来解决。
曲线办法解释:通过脚本将 自动隐藏和显示菜单栏 状态设置为始终,由于macOS在这种状态下,你向上移动鼠标指针并停留依然会显示菜单栏并影响游戏,故我通过编写程序来阻止鼠标指针移动到屏幕顶端/处理鼠标指针触顶后的一些操作。
本人环境: macOS 15.5(文章发布时的macOS最新正式版,请看更新说明来支持macOS 26),M1 MAX(arm架构)
注:由于技术力有限(源代码写的过于丑陋),就不贴源代码了,仅提供可在Apple silicon(ARM架构)下运行的二进制文件(技术力提高,提高二进制兼容性,适配不同的macOS)。
关于程序实现方式,我是通过CGEventTap来处理鼠标的移动事件,这种实现方式在用户态实现且过程中开销有点大,我无力解决(IOHIDManager等更底层的实现的方式我不会),但要比我最开始用Hammerspoon写的lua脚本性能高多了(后面可以贴贴我这个lua脚本,写的很简洁)
关于菜单栏状态切换.scpt脚本,如果 自动隐藏和显示菜单栏 状态如果不为 永不,那么切换为 永不,否则切换为 始终(这是符合我的使用习惯的,如果需要请自行修改)。
另外,这个脚本和macOS其他版本大概率不兼容,我只在我当前版本测试通过,其他版本请自行修改代码。
注:非中文用户如果需要使用 简易版,则需要修改菜单栏状态切换.scpt文件(修改起来很简单,你只需要将文件中第23到26行中的中文替换为你本机上对应按钮的语言即可),因为我这个脚本是以我中文界面编写的。
为了方便想要自定义某些操作的用户,下面我将提供2种方式来介绍。
简易版
建议懒人(比如我😂)使用此方式(自定义用户也可作为参考).
将下面命令在终端中运行.
1 | user=$(whoami);echo -n "${user}" | pbcopy |
点击 添加快捷指令 ,然后选中 游戏模式切换 右键选择编辑,然后选中这段文字 这里填你的用户名 ,然后右键点击粘贴,然后关闭窗口。
你需要在 系统设置 中 隐私与安全性 中 辅助功能 中添加 快捷指令 应用(需要给权限)
之后要运行,点击对应快捷指令右上角的运行即可。
注:如果你需要程序有高优先级(保证程序在游戏过程中能优先处理鼠标指针位置,我是建议这样做的),则需要在 快捷指令 中勾选 以管理员身份运行 ,同时还需要在 辅助功能 中添加 XPCServices/ShortcutsMacHelper.xpc ,如何添加?通过终端运行这个命令 open /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices 打开文件夹并选中 XPCServices/ShortcutsMacHelper.xpc 然后拖入 辅助功能 列表中,授权即可(macOS有bug,授权成功后在列表里面看不到),你还要将 MouseWall_Refactored 文件也拖入辅助功能 列表中。
如果下载失败,你可以选择通过代理下载或者将 lanyun.pages.dev 替换为 lanyundev.com 并在浏览器的无痕模式中进行下载。
自定义
懒得写了,简易版讲的很清楚了,会改的人我也不用多说,直接贴可能需要的文件下载链接
菜单栏状态切换.scpt 游戏模式切换.sh 游戏模式切换.shortcut MouseWall MouseClick MouseWall_Refactored MouseWall_Refactored_NoLimit
关于Hammerspoon写的lua文件(init.lua)如下
1 | th = 5 |
可以手动验证一下一些文件的完整性,避免因网络缓存等原因导致与预期不符。
1 | sha512sum MouseWall |
更新说明
目前顺序是由旧->新,如果你想看最新说明请从最后开始看
MouseWall 二进制文件已被弃用,因为存在一个严重问题,即在开放世界中无法将鼠标持续向上移动,因为这个程序会阻止鼠标指针触顶。
我重新编写一套处理方式,MouseClick 程序性能比较优秀,因为只处理鼠标指针点击事件,所以开销很小,逻辑:当发生鼠标指针点击事件时,判断纵坐标是否<=48px,如果是,则鼠标指针位置纵坐标+48px并在新位置发送点击事件,这样可以避免点击菜单栏,否则按照正常流程处理,这样实现也存在一个小问题,当鼠标指针点击位置在<=48px时,画面会立刻下移改变(我尝试过不移动鼠标指针位置,而只在新位置发送鼠标指针点击事件,但macOS系统不认定这种方式,会导致原生鼠标指针显示)。
我原本还有个折中的想法,即在没有触顶时,鼠标指针纵坐标即使<=48px也不进行移动,在触顶后,如果鼠标指针离开了菜单栏区域又重新回到菜单栏区域且鼠标指针没有触顶则不进行移动,但这样需要同时处理点击和移动事件,开销会多一点,而且我不想这样做,因为处理鼠标指针移动事件开销始终会多一些(然后不想去思考逻辑了,懒..)。好吧,我还是去做了,二进制文件名为MouseWall_Refactored,但CPU开销会比MouseClick多一些,建议低性能设备使用MouseClick,并修改游戏模式切换.sh脚本中对应的BINARY_PATH和PID_FILE变量值即可。
注:本程序只能缓解问题,并不能真正解决问题,问题是有可能在某些情况复现的,本人水平有限就先这样了吧。睡觉觉去咯~
我注意到当鼠标指针按下后向底部移动再移出也会导致鼠标指针变原始的,故我更新了 游戏模式切换.sh 脚本文件(如果不需要请自行删除相关代码,我发现并不是在未隐藏dock栏的所有情况下都会出现此问题,故我注释掉了相关代码,不再作为默认处理,有需要则自行取消注释相关代码),能实现伪长久隐藏dock栏,通过defaults write com.apple.dock autohide-delay实现,但缺点是需要重启Dock进程,这会导致你最小化的窗口都会在前台显示,需要重新手动最小化(我觉得这是小事,小问题,也没想出好的自动化来处理这个),如果你想要点击Dock栏中某个项,但又不想关闭 游戏模式,那么你可以 control + 上箭头 来调出 调度中心(这个时候就会显示dock栏了)。注:需要在隐藏dock栏之后启动游戏(即需先切换为 游戏模式)
发现一个特性,在离开菜单栏区域后在菜单栏未消失前又再次进去且未触顶,然后鼠标指针的点击事件导致的原始鼠标指针显示。为什么会这样,我发现在 自动隐藏和显示菜单栏 为 始终 下,当前应用未全屏状态下,鼠标指针触顶显示菜单栏后,鼠标指针纵坐标y到达大约48px即可隐藏,但到了全屏应用中发现需要到达大约189px才会隐藏,故需要修改代码逻辑。但似乎并没有影响全屏游戏,故没有修改这方面代码。不过我又优化了一下代码逻辑,在鼠标指针触顶且未离开菜单栏区域中发生点击事件后会移动鼠标指针纵坐标y=49px,并在原位置发送点击事件,在下次手动移动鼠标指针时恢复为原位置移动。
目前程序已知缺陷(/特性): 在往上移动鼠标指针触顶且未离开菜单栏范围进行点击的话,虽然点击位置依然是原位置,但是画面会因为鼠标指针的移动而发生移动,再次移动鼠标指针,画面也会移动。目前只基于原生16英寸主显示器默认分辨率(1728x1117)做适配,未对外接显示器做适配,为避免对x<0或x>1728的外接显示器操作造成影响,已跳过处理。
在macOS 26 beta 2上,我重新分析了布局信息,你只需要将 菜单栏状态切换.scpt 文件中的 group 9 of scroll area 1 of group 1 of group 2 改为 group 1 of scroll area 1 of group 1 of group 3 即可在macOS 26上继续运行.
为满足对外接显示器用户的需求(其实是我😂),现增加二进制文件MouseWall_Refactored_NoLimit,不再对x轴做限制,如果要用管理员权限运行的话,别忘了给这个二进制添加辅助功能权限哦~
提高二进制文件兼容性,性能优化和多显示器处理之后有空再搞,原始 MouseWall 二进制文件重命名为 old_MouseWall ,新版 MouseWall_Refactored_NoLimit 二进制名改为 MouseWall 并作为默认二进制使用.
备注: League of Legends(英雄联盟) 实际上点击不到菜单栏区域(因为游戏分辨率不支持macOS真全屏16:10),但是这游戏bug多的批爆,你需要先切换到无边框模式再切换回全屏才能不会显示原始鼠标指针。












