将NSWindow投射到NSPanel

时间:2014-01-24 07:34:26

标签: objective-c cocoa applescript

我正在访问虚拟键盘(外部应用程序 - 在Adobe 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

2 个答案:

答案 0 :(得分:3)

NSPanelNSWindow,反之则不然 - 继承无论如何都不起作用!

此外,将对象引用从一种类型转换为另一种类型不会更改引用对象的实际类型,因此即使将A *强制转换为B *,也可以调用方法与没有强制转换的方法相同 - 强制转换用于通知编译器您知道引用的实际对象是不同的类型,因此在调用B方法时会使编译器静默。

即使您可以完成所有这些操作,也表示您希望键盘不可聚焦,这与非激活不同 - 前者是关于应用程序主窗口 ,后者是关于接受输入而不激活应用程序。

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

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

HTH

答案 1 :(得分:2)

AS由@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];