Ram*_*tra 4 macos cocoa swift swift5
我正在 Swift 中制作 macOS 应用程序,并且我的应用程序的窗口始终位于其他应用程序之上。即使这些应用程序处于全屏模式,这也适用于所有应用程序。但是,当 Keynote 在全屏模式下运行并且我的应用程序位于其之上时,适用于我的应用程序的所有鼠标事件也会转到 keynote 并退出全屏。
我不确定发生了什么,但我需要防止 keynote 退出全屏。我怎样才能做到这一点?
我的应用程序的窗口级别是NSWindow.Level.popUpMenu
. 而且,我已经尝试了以下方法,但到目前为止没有任何效果:
window.orderFrontRegardless()
window.makeKeyAndOrderFront(self)
window.order(.above, relativeTo: 0)
Run Code Online (Sandbox Code Playgroud)
TL;DR - 这里的问题是应用程序激活。
这并不能准确回答你的问题:
macOS中如何阻止其他应用程序监听鼠标事件?
这个答案演示了如何在不阻止其他应用程序侦听 macOS 中的鼠标事件的情况下实现您想要的目标。
检查以下屏幕截图。第一个包含活动的 Xcode 窗口,另一个包含非活动的 Xcode 窗口。您的目标是保持其他应用程序窗口处于活动状态,即使您单击叠加层也是如此。其他应用程序是否正在运行演示文稿(如 Keynote,全屏)无关紧要。
Main.storyboard
并删除窗口并查看控制器场景LSUIElement
YES
Info.plist
AppDelegate.swift
代码(如下)我刚刚使用 Keynote 10.0 和 macOS Catalina 10.15.4 (19E287) 对其进行了测试,它按预期工作 - 我可以在不中断正在运行的演示文稿的情况下单击红色覆盖层内部,我可以使用键盘控制演示文稿,...
NSPanel
而不是NSWindow
styleMask
& .nonactivatingPanel
(不能与 一起使用NSWindow
)
hidesOnDeactivate
false
becomesKeyOnlyIfNeeded
true
needsPanelToBecomeKey
需要键盘输入collectionBehavior
[.canJoinAllSpaces, .fullScreenAuxiliary]
.canJoinAllSpaces
= 窗口出现在所有空间(如菜单栏).fullScreenAuxiliary
= 具有此集合行为的窗口可以与全屏窗口显示在同一空间上import Cocoa
import HotKey
final class OverlayView: NSView {
private var path: NSBezierPath?
override func keyDown(with event: NSEvent) {
print("keyDown - \(event.keyCode)")
}
override func keyUp(with event: NSEvent) {
print("keyUp - \(event.keyCode)")
}
override func mouseDown(with event: NSEvent) {
let point = self.convert(event.locationInWindow, from: nil)
path = NSBezierPath()
path?.move(to: point)
needsDisplay = true
}
override func mouseUp(with event: NSEvent) {
path = nil
needsDisplay = true
}
override func mouseDragged(with event: NSEvent) {
let point = self.convert(event.locationInWindow, from: nil)
path?.line(to: point)
needsDisplay = true
}
override func draw(_ dirtyRect: NSRect) {
guard let ctx = NSGraphicsContext.current?.cgContext else {
return
}
defer {
ctx.restoreGState()
}
ctx.saveGState()
NSColor.green.set()
ctx.stroke(bounds, width: 8.0)
guard let path = path else {
return
}
path.lineWidth = 5.0
NSColor.green.set()
path.stroke()
}
override var acceptsFirstResponder: Bool {
true
}
override var needsPanelToBecomeKey: Bool {
true
}
}
final class OverlayWindow: NSPanel {
convenience init() {
self.init(
contentRect: NSScreen.main!.frame,
styleMask: [.borderless, .fullSizeContentView, .nonactivatingPanel],
backing: .buffered,
defer: false
)
canHide = false
hidesOnDeactivate = false
contentView = OverlayView()
isFloatingPanel = true
becomesKeyOnlyIfNeeded = true
acceptsMouseMovedEvents = true
isOpaque = false
hasShadow = false
titleVisibility = .hidden
level = .popUpMenu
backgroundColor = NSColor.black.withAlphaComponent(0.001)
collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
}
override var canBecomeKey: Bool {
true
}
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private var hotKey: HotKey!
private var overlayWindowController: NSWindowController?
func applicationDidFinishLaunching(_ aNotification: Notification) {
hotKey = HotKey(key: .o, modifiers: [.command, .option])
hotKey.keyDownHandler = toggleOverlay
}
private func toggleOverlay() {
if overlayWindowController != nil {
overlayWindowController?.close()
overlayWindowController = nil
} else {
overlayWindowController = NSWindowController(window: OverlayWindow())
overlayWindowController?.showWindow(self)
overlayWindowController?.window?.makeKey()
}
}
func applicationWillTerminate(_ aNotification: Notification) {
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
779 次 |
最近记录: |