没有窗口的可可弹窗

gfa*_*iev 0 macos cocoa

我是 Cocoa 开发的新手,我想知道是否可以通过热键在任何位置显示弹出框。OS X 词典应用程序非常接近预期的结果。我只想显示弹出窗口,在光标位置没有窗口。如果可能的话,你能提供一些这个弹出窗口的代码吗?

非常感谢。

man*_*ahn 7

为了实验目的,我做了这样的事情。诀窍是创建一个带有透明背景或 zeroSize 的自定义无边框窗口。

创建,显示和定位窗口后,可以从中显示弹出窗口。

对于窗口创建:
Objective-C

NSWindow* window = [[NSWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
window.opaque = NO;
window.backgroundColor = [NSColor clearColor];
window.level = NSStatusWindowLevel;
window.accessibilityHidden = YES;
[window makeKeyAndOrderFront:nil];
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
Run Code Online (Sandbox Code Playgroud)

迅速

window = NSWindow(contentRect: windowRect, styleMask: NSBorderlessWindowMask, backing: .Buffered, defer: true)
window.opaque = false
window.backgroundColor = NSColor.clearColor()
window.level = Int(CGWindowLevelForKey(.StatusWindowLevelKey))
window.setAccessibilityHidden(true)
window.makeKeyAndOrderFront(nil)
NSApplication.sharedApplication().activateIgnoringOtherApps(true)
Run Code Online (Sandbox Code Playgroud)

对于弹出框:
Objective-C

//Create popover .........
[popover showRelativeToRect:popoverRect ofView:window.contentView preferredEdge:NSMaxYEdge];
Run Code Online (Sandbox Code Playgroud)

迅速

//Create popover ......
popover.showRelativeToRect(popoverRect, ofView: window.contentView, preferredEdge: .MaxY)
Run Code Online (Sandbox Code Playgroud)

为了在单击屏幕上的某处时关闭弹出窗口,必须添加全局事件监视器:

目标-C

//Add global monitor to track when the popover should be closed
if (self.monitor == nil) {
    self.monitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask) handler:^(NSEvent* event) {
        [NSEvent removeMonitor:self.monitor];
        self.monitor = nil;
        [self.popover close];
        self.window = nil;
    }];
}
Run Code Online (Sandbox Code Playgroud)

迅速

if monitor == nil {
     monitor = NSEvent.addGlobalMonitorForEventsMatchingMask([.LeftMouseDownMask, .RightMouseDownMask /* and others like keyDown/Up if you want*/], handler: { (event: NSEvent) in
        NSEvent.removeMonitor(monitor!)
        monitor = nil
        popover.close()
        window = nil
    })
}
Run Code Online (Sandbox Code Playgroud)