已解决(8月4日):
经过一番摸索,我最终使用一个未公开的API参数解决了这个问题:
// Adds undocumented "appearance" argument to "popUpMenuPositioningItem":
@interface NSMenu (MISSINGOrder)
- (BOOL)popUpMenuPositioningItem:(id)arg1 atLocation:(struct CGPoint)arg2 inView:(id)arg3 appearance:(id)arg4;
@end
我现在可以使用此隐藏的appearance
参数,而不必创建一个看不见的NSWindow
了!
更新(8月3日):
有趣的是,当我创建一个全新的Xcode项目时,以下代码可以正常工作:
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"];
[menu insertItemWithTitle:@"Beep" action:nil keyEquivalent:@"" atIndex:0];
[menu insertItemWithTitle:@"Honk" action:nil keyEquivalent:@"" atIndex:1];
NSPoint mouseLocation = [NSEvent mouseLocation];
NSRect contentRect = NSMakeRect(mouseLocation.x, mouseLocation.y, 0, 0) ;
NSWindow *tmpWindow = [[NSWindow alloc] initWithContentRect:contentRect
styleMask:0
backing:NSBackingStoreBuffered
defer:NO] ;
tmpWindow.releasedWhenClosed = NO ;
tmpWindow.appearance = [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark] ;
[tmpWindow orderFront:nil] ;
[menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(0,0) inView:tmpWindow.contentView] ;
[tmpWindow close] ;
}
问题是,为什么这种精确的代码在Hammerspoon代码库中不起作用?有什么想法吗?
短篇小说:
如何在特定的系统坐标位置上显示NSMenu
弹出框,且其外观较暗?
长篇故事:
我目前正在尝试对Hammerspoon进行补充,以使弹出菜单的外观变暗。
这里是unmodified original code,效果很好(尽管它总是看起来很“轻”)。
这是我的work-in-progress modifications。
我当前使用的是一个隐藏的NSWindow
,其中包含“ NSMenu
”弹出窗口,因此我可以使NSWindow
显得很暗。
这在单个屏幕上效果很好,但是当您具有双屏幕时,弹出窗口仅在具有macOS菜单栏(在macOS的“显示偏好设置”的“排列”选项卡中选择)的屏幕上可见。
我已经尝试了许多其他方法来解决(请参阅here),但是还没有任何运气。
我知道NSWindow
在两个屏幕上都正确显示-只是弹出窗口显示的位置不正确,所以我确定我在弹出位置上的数学错误(在NSWindow
的上下文。
任何帮助将不胜感激!