首页 > 解决方案 > popUpMenuPositioningItem:atLocation:inView: 双屏失败

问题描述

已解决(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进行添加,以使弹出菜单具有深色外观。

这是未经修改的原始代码,效果很好(尽管它总是具有“轻”的外观)。

这是我正在进行的修改

我目前正在使用一个隐藏NSWindow的“包含”NSMenu弹出窗口,这样我就可以制作NSWindow一个黑暗的外观。

这在单屏幕上效果很好,但是当您有双屏幕时,弹出窗口仅在具有 macOS 菜单栏的屏幕上可见(在 macOS 的显示首选项的排列选项卡中选择)。

我尝试了很多不同的事情来解决(见这里),但还没有运气。

我知道NSWindow在两个屏幕上都正确显示 - 只是弹出窗口没有在正确的位置显示,所以我确定我只是在弹出位置(在上下文中NSWindow)的数学错误。

任何帮助将不胜感激!

标签: objective-ccocoahammerspoon

解决方案


推荐阅读