【问题标题】:Check if NSStatusItem is visible in system menu bar?检查 NSStatusItem 在系统菜单栏中是否可见?
【发布时间】:2013-03-29 10:25:29
【问题描述】:

是否可以检查 NSStatusItem 在系统菜单栏中是否可见?有时不是因为用户有太多的状态项和活动的应用程序菜单栏大小。

我可以像这样通过“hack”检查状态项的位置:

statusRect = [[_statusItem valueForKey:@"window"] frame];

但我不能做同样的事情是可见的:(它总是返回真)

BOOL visible = [[_statusItem valueForKey:@"window"] isVisible];

【问题讨论】:

  • isVisible 的文档:“指示窗口是否在屏幕上可见(即使它被其他窗口遮挡)。” (或菜单,尽管这通常不是问题。)
  • @PeterHosey - 谢谢,但有什么办法可以解决这个问题(以确定它是否真的可见而不会被遮挡)
  • 您是否检查过隐藏项目的框架是否与显示的框架不同? -[NSWindow isVisible] 主要只是表明窗口是否已被订购。您应该检查-screen。如果窗口的框架与屏幕框架重叠,则窗口只有一个屏幕。您是否检查了状态项的视图而不是其窗口?您应该检查视图的window 是否为nil 以及是否为isHidden。 (您可能需要为状态项分配一个自定义视图以进行检查。)

标签: objective-c macos cocoa nsstatusitem


【解决方案1】:

我不相信没有真正糟糕的黑客是可行的

我的第一个:

在您的 NSStatusItem 中有一个视图,并将 window.isVisible 与视图的 visibleRect 结合起来。 无论如何,状态栏都不能被窗口遮挡。
=> 不起作用

2。试试

在您的 NSStatusItem 中查看并尝试来自Proper way to determine if NSView is drawn的 hack
=> 没用

真正的邪恶黑客可能会起作用

通过辅助功能 api 模拟鼠标点击并查看您的视图是否收到事件:


我尝试过的

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
    item.title = @"TEST";
    view = [[DDQuickMenuStatusItemView alloc] init];
    view.item = item;
    view.title = item.title;
    item.view = view;
    
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(checkVisible:) userInfo:nil repeats:YES];
}

- (void)checkVisible:(id)timer {
    NSLog(@"NOT WORKING vis: %d", (view.window.isVisible && !NSEqualRects(view.visibleRect, NSZeroRect)));
    NSLog(@"NOT WORKING isDrawn: %d", (view.isDrawn));
}

【讨论】:

  • 感谢您的辛勤工作!多亏了你,我找到了解决方案。使用辅助功能 api,我可以使用 AXUIElementCopyElementAtPosition 找到 AXUIElelementRef 的视图位置。然后我只需将 PID (AXUIElementGetPid) 与我的应用程序 PID 进行比较。
  • 不错,没想到那个API!
  • 对于那些对 Wesley 是如何做到这一点感兴趣的人,这里有一个描述所涉及的一些工作的链接:stackoverflow.com/a/27589911/869838
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多