我正在访问虚拟键盘(外部应用程序-在Adobe中)。我想那个键盘应该是不可聚焦的。所以我必须申请
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
发布于 2014-02-17 06:57:07
由@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];发布于 2014-01-25 08:57:36
NSPanel是一个NSWindow,相反不是真的--继承不是双向工作的!
此外,将对象引用从一种类型转换到另一种类型并不会改变引用对象的实际类型,因此即使您将一个A *强制转换为一个B *,然后调用一个方法,您也会得到与没有转换的方法完全相同的方法--该转换用于通知编译器,您知道引用的实际对象是不同的类型,因此在调用B方法时会使编译器安静下来。
即使你能克服所有这些,你也希望键盘是非聚焦的,这与非激活不一样前者是一个应用程序的主窗口,后者是关于在不激活应用程序的情况下接受输入。
应用程序的主窗口是焦点窗口,其框架以某种方式突出显示,应用程序的关键窗口是接受用户输入的窗口。他们往往是同一个窗口,但不必是。这听起来像是你希望你的键盘通过键窗口而不是主窗口--也就是说,表现得像一个面板。
NSWindow有canBecomeMainWindow和canBecomeKeyWindow方法,它们分别决定窗口是否可以成为主窗口或键。虽然不能更改NSWindow实例的返回内容,但您可以子类NSWindow并重写这些方法--这就是NSPanel所做的--请参阅这些方法的NSWindow文档。因此,如果您将KeyboardWindow定义为一个NSWindow子类,并重写canBecomeMainWindow以返回NO。这样做,您就有一个窗口将不会成为主(焦点),但可以接受输入。
HTH
https://stackoverflow.com/questions/21326958
复制相似问题