// Source - https://stackoverflow.com/q/79826930
// Posted by DwangML, modified by community. See post 'Timeline' for change history
// Retrieved 2025-12-01, License - CC BY-SA 4.0
import AppKit
import objc
from Cocoa import NSColor, NSFont, NSBezierPath, NSAttributedString, NSForegroundColorAttributeName, NSFontAttributeName
class OverlayContentView(AppKit.NSView):
def initWithFrame_(self, frame):
self = objc.super(OverlayContentView, self).initWithFrame_(frame)
if self:
self.shapes = []
return self
def drawRect_(self, rect):
for item in self.shapes:
color = item.get('color', NSColor.redColor())
color.set()
if item['type'] == 'rect':
NSBezierPath.fillRect_(item['rect'])
elif item['type'] == 'text':
text = item['text']
font_size = item.get('font_size', 24)
font = NSFont.systemFontOfSize_(font_size)
attr = {NSFontAttributeName: font, NSForegroundColorAttributeName: color}
ns_text = NSAttributedString.alloc().initWithString_attributes_(text, attr)
ns_text.drawAtPoint_(item['rect'][:2])
def add_box(self, x, y, width, height, color=NSColor.redColor()):
self.shapes.append({'type': 'rect', 'rect': ((x, y), (width, height)), 'color': color})
self.setNeedsDisplay_(True)
def add_text(self, x, y, text, font_size=24, color=NSColor.redColor()):
self.shapes.append({'type': 'text', 'rect': (x, y, 0, 0), 'text': text, 'font_size': font_size, 'color': color})
self.setNeedsDisplay_(True)
class OverlayWindow(AppKit.NSWindow):
def initWithFullScreenFrame_(self, frame):
self = objc.super(OverlayWindow, self).initWithContentRect_styleMask_backing_defer_(
frame,
AppKit.NSWindowStyleMaskBorderless,
AppKit.NSBackingStoreBuffered,
False
)
if self:
self.setLevel_(AppKit.NSStatusWindowLevel)
self.setOpaque_(False)
self.setBackgroundColor_(NSColor.clearColor())
self.setIgnoresMouseEvents_(True)
self.content_view = OverlayContentView.alloc().initWithFrame_(frame)
self.setContentView_(self.content_view)
return self
def add_box(self, x, y, width, height, color=NSColor.redColor()):
self.content_view.add_box(x, y, width, height, color)
def add_text(self, x, y, text, font_size=24, color=NSColor.redColor()):
self.content_view.add_text(x, y, text, font_size, color)
# Get main screen frame
screen = AppKit.NSScreen.mainScreen()
frame = screen.frame()
window = OverlayWindow.alloc().initWithFullScreenFrame_(frame)
window.makeKeyAndOrderFront_(None)
# Example shapes
window.add_box(100, 100, 300, 150)
window.add_text(150, 300, "Full Screen Overlay", font_size=48)
# Run app
AppKit.NSApp = AppKit.NSApplication.sharedApplication()
AppKit.NSApp.run()
Вот мой текущий код, он отлично работает с настольными/не полноэкранными приложениями. Когда я когда-либо переключаюсь в полноэкранный режим, оно действует как обычное окно (а оно и есть) и остается на рабочем столе, а не следует за полноэкранным приложением и накладывается на него. Как сделать его совместимым с полноэкранными приложениями?
Я использую MacOS M2. Оверлей не обязательно должен использовать эти библиотеки, поэтому, если у вас есть другие рабочие предложения (с другими библиотеками), они также подойдут. Если он использует Python и удовлетворяет требованиям. Спасибо, что уделили время.
Примечание. Мой аналогичный вопрос был закрыт без рассмотрения, поэтому появился новый вопрос.
[code]// Source - https://stackoverflow.com/q/79826930 // Posted by DwangML, modified by community. See post 'Timeline' for change history // Retrieved 2025-12-01, License - CC BY-SA 4.0
# Run app AppKit.NSApp = AppKit.NSApplication.sharedApplication() AppKit.NSApp.run() [/code] Вот мой текущий код, он отлично работает с настольными/не полноэкранными приложениями. Когда я когда-либо переключаюсь в полноэкранный режим, оно действует как обычное окно (а оно и есть) и остается на рабочем столе, а не следует за полноэкранным приложением и накладывается на него. Как сделать его совместимым с полноэкранными приложениями? Я использую MacOS M2. Оверлей не обязательно должен использовать эти библиотеки, поэтому, если у вас есть другие рабочие предложения (с другими библиотеками), они также подойдут. Если он использует Python и удовлетворяет требованиям. Спасибо, что уделили время. Примечание. Мой аналогичный вопрос был закрыт без рассмотрения, поэтому появился новый вопрос.