在macOS上实现Framebuffer写入相关程序的可行性问询
完全可行!不过Mac的图形系统和Linux那套直接操作/dev/fb0的帧缓冲路子不一样——Mac用的是Quartz 2D架构,没法像Linux那样直接读写帧缓冲设备文件。不过咱们有别的办法实现「无背景写入单个像素」的需求,甚至用Python就能轻松搞定。
方法一:用PyObjC调用Quartz API(最贴近直接操作屏幕)
Quartz是Mac的核心图形框架,能直接在屏幕上下文上绘制像素,不需要额外窗口。不过要注意:macOS 10.14及以上版本,需要给运行程序的终端/IDE授予「屏幕录制」权限(在系统偏好设置→安全性与隐私→隐私里配置)。
下面是Python实现代码:
import Quartz import time def draw_single_pixel(x, y, rgba_color): # 获取主屏幕的图形上下文 main_display = Quartz.CGMainDisplayID() screen_context = Quartz.CGDisplayCreateImageContext(main_display) # 设置绘制颜色(RGBA每个值范围0-1) red, green, blue, alpha = rgba_color Quartz.CGContextSetRGBFillColor(screen_context, red, green, blue, alpha) # 绘制1x1的矩形(等价于单个像素) Quartz.CGContextFillRect(screen_context, Quartz.CGRectMake(x, y, 1, 1)) # 将绘制内容同步到屏幕 Quartz.CGDisplaySetImage(main_display, Quartz.CGContextCreateImage(screen_context)) # 释放资源 Quartz.CGContextRelease(screen_context) # 测试:在(200, 200)位置绘制一个纯红色像素 draw_single_pixel(200, 200, (1, 0, 0, 1)) time.sleep(3) # 停留3秒查看效果
这个方法是直接往屏幕帧缓冲里写像素,Mac的窗口系统可能会很快覆盖这个像素(比如窗口移动、屏幕刷新),但完全符合你「被鼠标覆盖也无妨」的需求。使用前需要安装依赖:pip install pyobjc-framework-Quartz
方法二:用透明无边框窗口画像素(更稳定)
如果希望像素能持续显示一段时间,不会被屏幕刷新轻易覆盖,可以创建一个1x1的透明顶层窗口,只显示目标像素。用PyQt5就能快速实现:
import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QColor from PyQt5.QtCore import Qt class PixelOverlay(QWidget): def __init__(self, x, y, rgba_color): super().__init__() self.target_x = x self.target_y = y self.pixel_color = rgba_color self.init_window() def init_window(self): # 设置窗口为无边框、透明、始终置顶 self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool) self.setAttribute(Qt.WA_TranslucentBackground) # 窗口大小设为1x1,定位到目标坐标 self.setGeometry(self.target_x, self.target_y, 1, 1) self.show() def paintEvent(self, event): painter = QPainter(self) color = QColor(*self.pixel_color) painter.setPen(color) painter.setBrush(color) painter.drawRect(0, 0, 1, 1) if __name__ == '__main__': app = QApplication(sys.argv) # 在(300, 300)位置绘制绿色像素(RGBA值0-255) overlay = PixelOverlay(300, 300, (0, 255, 0, 255)) sys.exit(app.exec_())
这个方法的好处是像素会稳定显示,除非有其他顶层窗口压在上面。安装依赖命令:pip install pyqt5
小提示
不管用哪种方法,第一次运行时如果报错,大概率是权限问题,记得去系统偏好设置里给程序授予对应的隐私权限哦。
内容的提问来源于stack exchange,提问作者Riley Madison
相关产品推荐
相关产品推荐

