【问题标题】:Lion/Mountain Lion window on second monitor to display video or other information like output monitor第二个监视器上的 Lion/Mountain Lion 窗口,用于显示视频或其他信息,如输出监视器
【发布时间】:2013-07-13 13:54:38
【问题描述】:

我正在尝试将本机 OSX 应用程序编写为一种广告/多媒体播放器,它将其内容分发到建筑物周围的多个屏幕上。输出显示器连接到 iMac 或 Macbook Pro 辅助输出,分辨率均相同 (1280x720),并使用优质电缆和 VGA 分配器/增强器盒进行物理连接。

所以我要设置的是带有停靠栏和菜单栏的主屏幕将有播放列表。辅助监视器将具有视频输出 - 我正在使用 AVFoundation 进行视频播放,并且已经进行了各种测试以获得可编程视频播放。

我想让第二台显示器最初只是黑屏,上面有图像,这样当什么都没有播放时,人们就会看到。

我在 SO 上阅读了这篇文章: How to display on dual screens on Mac OS X Lion

但是,我似乎无法让它为我工作,并且有许多类似的示例代码相互冲突,所以我更多地问“我做错了什么?”。

到目前为止,测试应用程序是在 xcode(非文档)中创建为一个简单的 Cocoa 应用程序,这是我试图根据示例链接开始工作的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    NSUInteger c = [[NSScreen screens] count];
    NSLog(@"Number of screens = %li", (unsigned long)c);
    if ([[NSScreen screens] count] > 1) {
        NSLog(@"Attempting to setup second screen");
        NSScreen *screen = [[NSScreen screens] objectAtIndex:1];
        NSRect fs = [screen frame];
        NSLog(@"Second screen frame = x=%f, y=%f, w=%f, h=%f", fs.origin.x, fs.origin.y, fs.size.width, fs.size.height);
        NSRect ss = fs;
        NSWindow *win2 = [[NSWindow alloc] initWithContentRect:ss
                                                     styleMask:NSBorderlessWindowMask
                                                       backing:NSBackingStoreBuffered
                                                         defer:YES];

        [win2 setBackgroundColor:[NSColor blackColor]];
        [win2 setLevel:NSMainMenuWindowLevel+1];
        [win2 setOpaque:YES];
        [win2 setHidesOnDeactivate:YES];

        NSOpenGLPixelFormatAttribute attrs[] =
        {
            NSOpenGLPFADoubleBuffer,
            0
        };
        NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];

        NSRect viewRect = NSMakeRect(0.0, 0.0, fs.size.width, fs.size.height);
        NSOpenGLView *fullScreenView = [[NSOpenGLView alloc] initWithFrame:viewRect pixelFormat: pixelFormat];

        [win2 setContentView:fullScreenView];
        [win2 makeKeyAndOrderFront:self];

        NSButton *testButton = [[NSButton alloc] initWithFrame: NSMakeRect(50.0f, 50.0f, 100.0f, 50.0f)];
        [testButton setTarget:self];
        [testButton setAction:@selector(closeExternalWindow)];
        [fullScreenView addSubview:testButton];
        NSLog(@"Should have a black window with a button on it on monitor 2");
    }

}

我已将 OpenGL.framework 添加到项目中并包含在我的 .h 文件中。

在运行时,所发生的只是主窗口出现在主屏幕上,而辅助窗口上没有任何变化。我在这个测试中期望的是一个黑屏,在辅助窗口上有一个按钮,主窗口出现在主屏幕上。

真的很感激理解我不理解的东西。

谢谢

【问题讨论】:

  • NSLog(@"第二屏帧 = %@", NSStringFromRect(fs));
  • 谢谢geowar,不知道有没有这样的功能。

标签: cocoa fullscreen osx-mountain-lion


【解决方案1】:

我已经设法让它工作了。一开始并不明显,但我看到的是屏幕会点击一下然后回到桌面或它下面的任何东西。

问题出在上面的代码示例中,它创建了第二个窗口 - 在 sn-p 中,我声明

NSWindow *win2 = [[NSWindow alloc] initWithContentRect:ss
                                                     styleMask:NSBorderlessWindowMask
                                                       backing:NSBackingStoreBuffered
                                                         defer:YES];

问题是它是在本地声明的,而我正在使用 ARC,所以一旦当前函数的执行结束,win2 就会从内存中消失并从屏幕上移除。

通过将实例变量放入 .h 文件中已解决此问题

NSWindow *win2;

然后从 alloc/init 行中删除 NSWindow。

虽然我认为我已经足够彻底地阅读了文档,但我忘记的是 Apple 提醒人们阅读基本文档,这样他们就不必不断重复自己 - 更深入地研究 windows 等的概念,这就是全部写在那里。

我现在在我的第二台显示器上有一个窗口 - 好的,作为 NSBorderlessWindowMask 类型,我无法在其上放置控件,但我可以向其添加 NSImageView - 测试已完成,现在进入此应用程序的下一阶段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多