【问题标题】:Cast NSWindow to NSPanel将 NSWindow 转换为 NSPanel
【发布时间】:2014-02-17 14:57:07
【问题描述】:

我正在访问虚拟键盘(外部应用程序 - 在 Adob​​e Flex 中)。 我希望那个键盘应该是不可聚焦的。所以我必须申请

styleMask:NSNonactivatingPanelMask 

但我正在访问键盘

NSWindow *myMainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0];

因为 NSNonactivatingPanelMask 只能应用于 NSPanel

如果我可以将 NSWindow 类型转换为 NSPanel (?) 那么它可能。

---------我的上一个问题------------

Return focus to Editor after clicking a button in floating window of MAC

【问题讨论】:

  • 演员阵容从来没有真正改变对象的类型。它只是改变了你看待它的方式,所以投射无济于事

标签: objective-c cocoa applescript


【解决方案1】:

NSPanelNSWindow,反之则不然——继承不能双向工作!

此外,将对象引用从一种类型转换为另一种不会更改引用对象的实际类型,因此即使您将A * 转换为B *,然后调用方法也会得到与没有方法完全相同的方法强制转换 - 强制转换用于通知编译器您知道引用的实际对象是不同的类型,因此当您调用 B 方法时编译器会安静下来。

即使您可以克服所有这些,您也声明您希望键盘不可聚焦,这与不可激活不同 - 前者是关于成为应用程序主窗口 ,后者是关于在不激活应用程序的情况下接受输入。

应用程序的主窗口是被聚焦的窗口,它的框架以某种方式突出显示,等等。应用程序的键窗口是被聚焦的窗口。接受用户输入。它们通常是同一个窗口,但不一定是。听起来您希望键盘通过键窗口而不是主窗口 - 即表现得像一个面板。

NSWindow 有方法canBecomeMainWindowcanBecomeKeyWindow 分别确定一个窗口是否可以成为主窗口或主窗口。虽然您无法更改 NSWindow 实例的这些返回值,但您可以将 NSWindow 子类化并覆盖这些方法 - 这就是 NSPanel 所做的 - 请参阅这些方法的 NSWindow 文档。因此,如果您将KeyboardWindow 定义为NSWindow 子类并覆盖canBecomeMainWindow 以返回NO。这样做,您将拥有一个不会成为主要(聚焦)但可以接受输入的窗口。

HTH

【讨论】:

  • 我可以作为 NsPanel 对象访问外部应用程序吗?
  • 一个应用程序可以有窗口,但一个应用程序不是一个窗口,所以你不能将它作为一个窗口来访问——这意味着什么?所以你的问题写得没有意义,也许你问的是不同的东西?如果您有其他问题打开一个新问题,请不要将其作为评论提出,因为人们不会看到它。
  • 我的 Flex 应用程序应该在不激活拥有的应用程序的情况下接收键盘输入。 Flex 应用程序在运行时是用 Adob​​e Flex 编写的
【解决方案2】:

由@ashirbad 提供

NSWindow *mainWindow = [[NSApp windows] objectAtIndex: 0];
NSView *mainContentView = [mainWindow contentView];

NSPanel *mainPanel = [[NSPanel alloc] initWithContentRect:[mainContentView frame]
             styleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask
            backing:NSBackingStoreBuffered defer:YES];

[mainPanel setContentView:mainContentView];
[mainPanel setLevel:NSScreenSaverWindowLevel];

[mainPanel makeKeyAndOrderFront:nil];
[mainContentView orderOut:nil]; //error

这解决了我的问题。 但是我收到一个错误 orderOut 没有在 NSView 中定义。

如果顶部应用程序是 Mac 应用程序,那没关系,但如果它是 flex 应用程序(在这种情况下)。应用程序在此行没有响应。

[mainPanel setContentView:mainContentView];

【讨论】:

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