لا يمكن إخفاء نافذة من زوم على مك بوك 15
على macOS الحديث، لا يمكنك تجنب إخفاء نافذة من تسجيل الشاشة — سواء من تطبيق آخر أو حتى من تطبيقك نفسه. هذا هو السرد التقني لحذف دالة CGSSetWindowCaptureExcluded، وتجاهل دالة SLSSetWindowSharingState بشكل سكين عبر العمليات، وسبب أن NSWindow.sharingType = .none هو توصية غير قوية لـ Zoom وQuickTime، وليس ضمانًا صريحًا.
ملاحظة قصيرة في مجال الهندسة حول بناء تطبيق "نافذة خاصة" لا يعمل بشكل كامل.
الفكرة
كثير من الناس، أعمل مع نافذة كلاود على جهاز الكمبيوتر أثناء الاجتماعات. وكثير من الناس، أشارك شاشتي في زوم في بعض الأحيان، وأرغب أن تكون النافذة غير مرئية للجميع في المكالمة. ليس لأن هناك شيء سري — فقط لأنها حالة عمل خاصة.
أعرف أن تطبيقات مثل 1Password وHand Mirror يمكنها إخفاء نوافذها من تسجيل الشاشة. فكنت أعتقد أنني أستطيع بناء أداة صغيرة في شريط القائمة تسمح لي باختيار أي تطبيق — كلاود، ملاحظات، أي شيء آخر — وتبديل إخفاء نافذته أثناء التسجيل، مع الحفاظ على تفاعلها الكامل والمرئية على شاشتي الخاصة.
مشروع عطلة نهاية الأسبوع. أقصى وقت ممكن ساعتين.
استغرق الأمر وقتًا أطول. والنتيجة هي: على نظام macOS الحديث، لا يمكنك القيام بذلك. ليس لتطبيق آخر، و— كما تبين — ليس بشكل موثوق حتى لتطبيقك الخاص.
هذا هو سرد الهندسة حول السبب.
المحاولة 1: إخفاء نافذة تطبيق آخر
الطريقة التقليدية لإخفاء نافذة على نظام macOS من التسجيل الشاشي هي NSWindow.sharingType = .none. لكن هذه علامة على النافذة المخصصة التي يمكن فقط تعيينها من قبل العملاء العملية.
الحل المعروف، الذي يستخدمه أداة مثل Hand Mirror وعديد الأدوات التي تُستخدم لمسح الشاشة، هو دالة SkyLight الخاصة:
OSStatus CGSSetWindowCaptureExcluded(CGSConnectionID cid, CGWindowID wid, bool excluded);
تُستخدم دالة تصفية النافذات من خلال CGWindowListCopyWindowInfo، وتُفلت إلى رقم PID للتطبيق المستهدف، ثم يتم استدعاء هذه الدالة لكل رقم نافذة. لأن هذا الاستدعاء يمر من خلال WindowServer (بدلاً من العملية المُلكية)، فإنه يمكن استثناء أي نافذة من التسجيل.
أوصلت هذا عبر dlsym en el /System/Library/PrivateFrameworks/SkyLight.framework/...، أنشأتها، وقمت بتشغيلها على نظام macOS 15.3.1، وحصلت على:
[InvisibleApp] symbol not found: CGSSetWindowCaptureExcluded
[InvisibleApp] symbol not found: SLSSetWindowCaptureExcluded
الدالة مُحذوفة . أزلتها أبل. تجولت لنسخة مُعاد تسمية (، جميع الأشكال الواضحة). لا توجد معظمها، لكن وجدت اثنين يُمكن استخدامهما:SLSSetWindowExcludedFromCapture, CGSSetWindowSharingState— الدالة الأساسية التي
SLSSetWindowSharingState(CGSConnectionID, CGWindowID, int sharingState)تستخدمها داخليًا. مشاركة الحالةNSWindow.sharingType = .none— تُعطيك رقم الاتصال للعملية المُلكية للنافذة.0يكونNSWindowSharingNone.SLSGetWindowOwnerلذلك، أعدت بناء الربط لاستدعاء
على النافذة المستهدفة، وحاولت استخدام الاتصال الرئيسي واتصال المُلكية للنافذة. SLSSetWindowSharingState بناء، تشغيل، تفعيل، السجل يُظهر أن الاستدعاء عاد
، اخذ صورة شاشة — كلاود ما زالت في الصورة. جربت زوم — كلاود ما زالت في مشاركة الشاشة. noErrتُحقق النجاح عند استدعاء عبر العمليات، لكن WindowServer يتجاهله صامتًا.
SLSSetWindowSharingState فقط العملية المُلكية يمكنها تغيير حالة نافذة ملكيتها على نظام macOS 15. أكدت أيضًا أن الطرق المُستخدمة للهروب مغلقة:
الإدخال إلى عملية كلاود مُحظر لأن كلاود (كأي تطبيقات حديثة) يُستخدم بيئة مُحمية مُفعّلة بدون DYLD_INSERT_LIBRARIES الإذن. disable-library-validation لذلك، تم التأكيد:
لا يمكن لأي تطبيق خارجي أن يجعل نافذة تطبيق آخر غير مرئية أثناء التسجيل على نظام macOS 15. الاستنتاج يتوافق مع ما يقوله أبل: حالة التسجيل على مستوى النافذة هي ملكية التطبيق المُلكي، تمامًا. المحاولة 2: إخفاء نافذتنا الخاصة
الخطة البديلة: تغيير المنتج. بدلًا من أداة تُخفِّي كلاود، أنشئ نافذة محادثة صغيرة من نفسي — نفس المهمة، شكل مختلف. نافذة ملكية، ملكيتي.
هذا هو الميكانيزم المُستعمل بكثرة من أدوات إخفاء التسجيل، وهو سطر واحد فقط: sharingType = .noneربط محادثة تدفق مع واجهة API لرسائل Anthropic (أو إلى واجهة CLI المحلية للتحقق من التسجيل)، وتحديد
window.sharingType = .none
على نافذة المحادثة، ونقلها. هذه واجهة عامة، مدعومة، ومتاحة علنًا. claude أُنشئت. سجّلت القيمة الفعلية للنوع المخصص أثناء التشغيل لضمان قبولها من نظام macOS: sharingType = .none أخذ صورة شاشة — نافذة المحادثة كانت مفقودة بشكل صحيح. ✅
أُخذت الشاشة باستخدام QuickTime — نافذة المحادثة ظهرت في التسجيل. ❌
[InvisibleApp] window 151526 sharingType=0
تم مشاركة الشاشة في زوم — نافذة المحادثة مرئية للطرف الآخر. ❌
كان هذا مفاجئًا. الهدف الكامل
من
هو إزالتها من هذه التدفقات. لذا أنشأت اختبارًا داخليًا داخل التطبيق يقوم بتسجيل شاشة باستخدام ScreenCaptureKit (الواجهة الحديثة للتسجيل)، وهي نفس الواجهة التي يستخدمها QuickTime من الداخل. جربت التسجيل المفرد ( نقطة ) والتسجيل المستمر ( NSWindowSharingNone ) — كلاهما أنتج صورة PNG تُظهر نافذة المحادثة بشكل صحيح مُستبعد.SCScreenshotManager.captureImageلذلك:SCStreamطريقة التسجيل
يُخفِّي نافذتنا؟
| Cmd-Shift-3/4/5 (السّكرين شيرت النظام) | التسجيل المفرد من نافذة التطبيق باستخدام SCK |
|---|---|
| التسجيل المستمر من نافذة التطبيق باستخدام SCK | ✅ |
| QuickTime "تسجيل الشاشة الجديد" | ✅ |
| ❌ | ✅ |
| Zoom "مشاركة الشاشة → المكتب" | نفس النظام، نفس الجهاز، نفس النافذة، نفس |
| . المُختلف الوحيد هو من يُسجّل. | نفس النظام، نفس الجهاز، نفس النافذة، نفس |
المسارات المُميزة sharingType = .noneهذا الجزء لا يدركه معظم المهندسين:
على نظام macOS 15، التسجيل ليس واجهة واحدة؛ بل على الأقل اثنتين — واحدة عامة، وواحدة خاصة مع صلاحيات إضافية.
أخرجت صلاحيات QuickTime Player: هذه
الإمكانيات يمكن أن تُمنح فقط من قبل أبل إلى برامجها الخاصة. لا يمكن أن نطلبها. سيرفض التسجيل المُعتمد. بالتأكيد سيرفض متجر التطبيقات.
codesign -d --entitlements - /System/Applications/QuickTime\ Player.app
com.apple.private.screencapturekit.noprompt = true
com.apple.private.tcc.allow = [
kTCCServiceMicrophone,
kTCCServiceCamera,
kTCCServiceScreenCapture,
]
والمُعطى، بالإضافة إلى تجاهل طلب التسجيل، هو القدرة على تسجيل صورة الشاشة com.apple.private.* قبل تطبيق تصفية التسجيل من قبل WindowServer
. النافذة موجودة في الذاكرة المُعرضة التي تخرج — أدوات أبل فقط ترى كل شيء. يستخدم زوم مسارًا مماثلًا مُميزًا. قد يكون ذلك ملحقًا للنظام، أو واجهة خاصة مُكتسبة كأداة تُستخدم لفترات طويلة في تطبيقات المكالمات — لم أستكشف بعمق ما هو، لكن السلوك نفسه هو نفسه: لا يُطبّق الميكانيزم العام للإبعاد.ما يعنيه
إذا كنت مطورًا خارجيًا وهدفك هو "لا يجب أن تظهر النافذة في تسجيل شاشة على أي جهاز ماك"،
فلا يمكنك ضمان ذلك على نظام macOS 15.
نافذتك مخفية من جميع طرق التسجيل التي يمكنك كتابتها. مخفية من Google Meet (متصفح → → SCK)، Microsoft Teams (SCK)، OBS (SCK)، كل الأدوات المُستندة إلى المعايير. لكن أبل وشركاء المكالمات المُسموح لهم يمكنهم رؤيتها. يملك ميزة "حماية التسجيل" في 1Password / Hand Mirror نفس هذا القيود. الناس فقط لا يُسجلون محفظة 1Password بـ QuickTime، لذا لا يُلاحظ التسرب. getDisplayMedia الملخص الصريح الذي سأعطيه لأبل حول هذا:
أصدر صلاحية عامة مماثلة لـ
، أو اعترف أن هي ضمان صارم ضد com.apple.private.screencapturekit.nopromptجميع NSWindow.sharingType = .none طرق التسجيل. كما هو الحال في نظام macOS 15.3.1، فهي ليست كذلك — فهي ضمان صارم ضد معظم الطرق واقتراح مُضعف يسمح للأدوات المُميزة بالتجاوز. الحالة الراهنة تخلق وضعًا أمنيًا حيث يعتقد المستخدم أن النافذة غير مرئية أثناء التسجيل، بينما في الحقيقة فهي مرئية، وهو أسوأ من عدم وجود حماية على الإطلاق. الحلول المُستخدمة، مرتبة حسب مدى تأثيرها السلبي لأغراضي — الحفاظ على نافذة المحادثة غير مرئية أثناء مشاركة الشاشة في زوم — كلها تعمل ولكن لا تُعتبر جيدة:
أرسل نافذة واحدة فقط في زوم، وليس الشاشة ككل.
يحتوي حوار مشاركة الشاشة على علامة "نافذة". يُسجل فقط بيكسلات النافذة، ولا شيء آخر، لذا فإن المحادثة — وكل شيء آخر على الشاشة — يُظهر تلقائيًا. هذه هي الحل الأكثر موثوقية، ولا يتطلب أي كود. العيب: لا يرى المشاهدون سياق الشاشة ككل.
- استخدم مُجمّعات مثل مُجمّعات مُتاحة. تُحترم
- . هذا جيد إذا كنت تتحكم في أداة الاجتماع، سيئ إذا لم تكن. ضع المحادثة على مساحة منفصلة.
sharingType = .noneيُتيح لك ميزة ميسيون مساحات متعددة. اجعل مساحة 1 مشاركة، واحتفظ بالمحادثة في المساحة 2. اسحب للتفاعل. بطيء، يُقوض التدفق، لكنه يعمل. - استخدم جهازًا ثانويًا. جهاز هاتف أو iPad بجانب جهاز الكمبيوتر لا يمكن لأي أداة تسجيل أن تُستغل، بحسب التعريف.
- أختار الخيار 1 مع التطبيق الذي أنشأه بالفعل. النافذة غير مرئية في حوالي 95% من طرق التسجيل، وعند استخدام مشاركة الشاشة في زوم، أستخدم فقط مشاركة النافذة. ما أرغب به في المستقبل
صلاحية عامة
تُسمح لتطبيق مُعتمد بتحديد "أن النافذة الخاصة بي مُستبعدة من
- التسجيل، حتى من المُستخدمين المُميّزين". اليوم، هذا غير ممكن. الصدق في كما هو الحال في نظام macOS 15.3.1، فهي ليست كذلك — فهي ضمان صارم ضد الوثائق.
- تُظهر الوثائق أنها ضمان صارم، لكنها ليست كذلك — على الأقل يجب أن تذكر أن الأدوات المُميّزة وأدوات أبل المُمنوحة صلاحيات خاصة يمكنها التسجيل بغض النظر. اليوم لا تذكر ذلك.
NSWindow.sharingTypeطريقة لفحص أي تطبيقات على النظام تمتلك صلاحيات تسجيل مميزة — مماثلة لـ "الملفات وال مجلدات" في الخصوصية والأمان. اليوم لا يوجد سطح يُمكن للمستخدمين أن يراقبوا من يمكنهم تجاوز خصوصيتهم. - حتى يُصدر أي من ذلك، يكون النص التصريحي هو: افترض أن أي نافذة على شاشتك يمكن أن تُسجل من قبل نظام التشغيل وأدوات الاجتماع الكبرى، بغض النظر عن ما تُحدد.
الواجهات المُستبعدة حقيقية — تعمل ضد معظم العالم — لكنها ليست حدود أمان يمكنك الاعتماد عليها ضد الأجزاء التي تهمك أكثر. sharingType لا يمكنك إخفاء نافذة من زوم على نظام macOS 15 2
تثبيت ملحقاتنا
أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع
恵 وصلت لوحة النتائج!
لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!
