popUpMenuPositioningItem:atLocation:inView:在双屏幕上失败

时间:2018-07-31 22:27:39

标签: objective-c cocoa hammerspoon

已解决(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的上下文。

任何帮助将不胜感激!

0 个答案:

没有答案