gpt4 book ai didi

macos - (OS X) 检测前端应用何时进入全屏模式

转载 作者:行者123 更新时间:2023-12-04 12:54:11 24 4
gpt4 key购买 nike

我正在编写一个“UIElement”应用程序,它在屏幕一侧显示一个状态窗口,类似于 Dock。

现在,当一个程序接管整个屏幕时,我需要像 Dock 一样隐藏我的状态窗口。

我有什么选择来检测这个和逆事件?

我喜欢避免通过定时事件进行轮询,也不能使用未记录的技巧(例如建议的 here)

什么不起作用:

  • kEventAppSystemUIModeChanged 注册一个 Carbon 事件处理程序event 是不够的 - 它可以检测 VLC 的全屏模式,但不适用于使用窗口右上角的新全屏小部件的现代 Cocoa 应用程序。
  • 同样,按照 Apple 关于 NSApplication presentationOptions API 的说明进行操作通过观察对 currentSystemPresentationOptions 属性的更改也无济于事 - 同样,它仅通知 VLC 的全屏模式,而不是使用窗口右上角全屏小部件的应用程序。
  • 使用 CGDisplayRegisterReconfigurationCallback 监视屏幕配置的更改不工作,因为这些全屏模式没有任何回调。
  • 最佳答案

    根据@Chuck 的建议,我想出了一个有点效果的解决方案,但可能不是万无一失的。

    该解决方案基于 10.7 的 new fullscreen mode for windows 的假设将这些窗口移动到新的屏幕空间。因此,我们订阅有关事件空间更改的通知。在该通知处理程序中,我们检查窗口列表以检测是否包含菜单栏。如果不是,则可能意味着我们处于全屏空间。

    根据 Chuck 的想法,检查“菜单栏”窗口是否存在是我能想到的最好的测试。不过,我不太喜欢它,因为它对内部管理的窗口的命名和存在做出了假设。

    这是 AppDelegate.m 中的测试代码,其中还包括对其他应用程序全屏模式的测试:

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
    NSApplication *app = [NSApplication sharedApplication];

    // Observe full screen mode from apps setting SystemUIMode
    // or invoking 'setPresentationOptions'
    [app addObserver:self
    forKeyPath:@"currentSystemPresentationOptions"
    options:NSKeyValueObservingOptionNew
    context:NULL];

    // Observe full screen mode from apps using a separate space
    // (i.e. those providing the fullscreen widget at the right
    // of their window title bar).
    [[[NSWorkspace sharedWorkspace] notificationCenter]
    addObserverForName:NSWorkspaceActiveSpaceDidChangeNotification
    object:NULL queue:NULL
    usingBlock:^(NSNotification *note)
    {
    // The active space changed.
    // Now we need to detect if this is a fullscreen space.
    // Let's look at the windows...
    NSArray *windows = CFBridgingRelease(CGWindowListCopyWindowInfo
    (kCGWindowListOptionOnScreenOnly, kCGNullWindowID));
    //NSLog(@"active space change: %@", windows);

    // We detect full screen spaces by checking if there's a menubar
    // in the window list.
    // If not, we assume it's in fullscreen mode.
    BOOL hasMenubar = NO;
    for (NSDictionary *d in windows) {
    if ([d[@"kCGWindowOwnerName"] isEqualToString:@"Window Server"]
    && [d[@"kCGWindowName"] isEqualToString:@"Menubar"]) {
    hasMenubar = YES;
    break;
    }
    }
    NSLog(@"fullscreen: %@", hasMenubar ? @"No" : @"Yes");
    }
    ];
    }

    - (void)observeValueForKeyPath:(NSString *)keyPath
    ofObject:(id)object
    change:(NSDictionary *)change
    context:(void *)context
    {
    if ([keyPath isEqual:@"currentSystemPresentationOptions"]) {
    NSLog(@"currentSystemPresentationOptions: %@", [change objectForKey:NSKeyValueChangeNewKey]); // a value of 4 indicates fullscreen mode
    }
    }

    关于macos - (OS X) 检测前端应用何时进入全屏模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896803/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com