【问题标题】:How to create a window in browser which has a NSWindow handle?如何在具有 NSWindow 句柄的浏览器中创建一个窗口?
【发布时间】:2015-10-31 13:51:25
【问题描述】:

我正在为 mac 上的 safari 制作插件。我被困在如何在可以显示视频的浏览器窗口上创建一个窗口。

之前,我们使用 Cocoa 事件模型,在该模型下,NPP_SetWindow 函数中的 NPWindow 接收到的窗口指针为空。然后我们切换到 Carbon Event 模型,我们通过 NPWindow 结构中存在的窗口指针获得指向 NP_CGContext 的指针,使用它我们获得指向 WindowRef 的指针并获得指向 NSWindow 的指针,如下所示:

NP_CGContext* npContext = (NP_CGContext*)npWindow->window;
WindowRef window = npContext->window;
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:window] autorelease];

我们的流引擎接受指向NSWindow 的指针。我们不知道如何在浏览器空间中创建一个窗口。

因此,我们将不胜感激有关创建窗口的任何帮助。

【问题讨论】:

  • 我无法强烈建议您,您的一系列问题的前提——想要制作一个 NPAPI 插件来流式传输视频——存在严重且根本上的缺陷。 Chrome 已移除 NPAPI 插件支持,Mozilla 已宣布他们将在 2016 年底之前移除支持,虽然 Apple 尚未宣布任何计划,但它们通常并不以扩展支持已弃用技术而闻名。您选择了该项目最不可能继续存在的技术。我强烈建议对视频使用网络标准,或者制作应用程序而不是插件。

标签: nswindow npapi browser-plugin videodisplay


【解决方案1】:

我们的流引擎接受指向 NSWindow 的指针。我们不知道如何在浏览器空间中创建一个窗口。

您不应该这样做,正如previous answers 中所述。

需要 NSWindow 指针的流引擎非常不适合制作 NPAPI 插件。如果可能的话,您应该寻找可以获取或出售 CALayer 的东西,或者如果失败,可以将帧绘制到 CGContextRef 中(但这在进程外插件中会慢得多)。

如果您绝对必须使用 NSWindow,那么您需要在插件进程中创建一个与浏览器窗口完全无关的新窗口,并将其显示在屏幕上的某个位置。用户体验会相对较差,因为它不会随窗口移动,最终可能会落后于浏览器窗口等。浏览器供应商明确不鼓励这样做。但是,如果您别无选择,只能使用 NSWindow,那么这是现代浏览器的唯一选择。

【讨论】:

  • 他是绝对正确的(以防您出于某种原因需要第二意见)
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2011-10-17
相关资源
最近更新 更多