java macOS“Big-Sur”检测深色菜单栏/系统托盘
从macOS(10.16“Beta”/11.0)“Big Sur”开始,菜单栏和系统托盘不再支持桌面暗模式首选项,因此很难为该桌面正确设置系统托盘图标的主题
以前,使用shell命令default read
,可以检测到暗模式:
defaults read -g AppleInterfaceStyle
# "Dark"
这对于检测窗口主题仍然很有效,但对于菜单栏和系统托盘主题不起作用
由于该区域似乎受壁纸亮度/白度/亮度的影响,我们如何检测黑暗的系统托盘
如何在(例如)Objective-C/C++中检测此问题?任何解决方案都是受欢迎的,因为大多数方案都可以调整
问题也发布到苹果开发者论坛:https://developer.apple.com/forums/thread/652540
Qt5。6有一个名为^{
更多关于macOS“暗模式”的参考:
采用OpenJDK上游错误报告:
关键词:NSStatusBar
,Menu Bar Extras
# 1 楼答案
我也有同样的问题,但我想我找到了解决办法。正如在AppKit Release Notes for Big Sur中所写的(参见
NSStatusItem
的条目),您只需观察NSStatusItem
的button
的effectiveAppearance
。如果effectiveAppearance
的名称包含dark
,则为暗模式。否则就是灯光模式我创建的一个示例代码将
light
或dark
显示为NSStatusItem
的文本标签,可以在this GitHub repo处找到,具体请参见AppDelegate.m。(我很抱歉因为使用Objective-C而成为濒临灭绝的恐龙。)您可以通过在Catalina或Big-Sur上运行,从系统首选项更改暗/光设置或桌面图片的颜色来测试它编辑:事实证明,Big-Sur有时会从亮变亮或从暗变暗(从这个意义上说,尽管外观实际上没有改变,但调用了KVO)因此,建议在更改前后检查
effectiveApparance
的值,以确认实际更改的值# 2 楼答案
我刚刚提交了一份TSI,我得到了一个答案:
不幸的是,没有办法通过编程获得这些信息。 然而,获取信息对于我的三个应用程序来说非常重要,所以我开始探索
对我个人来说,获取这些信息不会触发任何安全提示是非常重要的
我想到了以下想法:
NSStatusItem
NSImage
CALayer
的内容呈现为NSImage
您可以使用此代码获取颜色信息(注意:
NSStatusItem
永远不可见,并且不会导致现有项目移动或类似情况)。请随意调整格式和类:我用公共属性创建了一个名为
MenuBar
的类:# 3 楼答案
对于Java17,添加了此功能。它最终将被后移植到Java11
https://github.com/openjdk/jdk/pull/481
新物业为:
从命令行:
-Dapple.awt.enableTemplateImages=true
。。。或通过Java:
System.setProperty("apple.awt.enableTemplateImages", "true");
请注意,从大Sur开始,图标不再是纯黑色或纯白色的(而是稍微有一点阴影),因此使用模板API对于正确的外观很重要;感觉
# 4 楼答案
尽管较新的JDK版本will have this ^{} feature natively ,但对于较旧的Java版本,此技术使用JNA,并且依赖于https://github.com/dyorgio/macos-tray-icon-fixer项目。在内部,它使用Java反射和JNA指针的组合来更新图像并设置^{} flag to true
它已经用JDK8和JDK11进行了测试。如果使用带有aarch64 support的JNA端口,它也可以与新的Apple Silicon Mac一起工作
多亏了@dyorgio的把戏