0

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

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

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

我在这里阅读这篇文章: 如何在 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 文件中。

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

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

谢谢

4

1 回答 1

0

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

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

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

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

通过在 .h 文件中放置一个实例变量来解决此问题

NSWindow *win2;

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

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

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

于 2013-07-23T12:25:16.413 回答