Создание полноэкранного наложения для MacOSPython

Программы на Python
Ответить
Anonymous
 Создание полноэкранного наложения для MacOS

Сообщение Anonymous »

Код: Выделить всё

// 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 и удовлетворяет требованиям. Спасибо, что уделили время.
Примечание. Мой аналогичный вопрос был закрыт без рассмотрения, поэтому появился новый вопрос.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -for-macos
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»