هل هناك اعتبارات خاصة لخدمة Windows لإرسال رسائل إلى Windows المستخدم؟

StackOverflow https://stackoverflow.com/questions/615195

سؤال

يجب أن أكتب تطبيق خدمة Windows (بدون واجهة المستخدم الرسومية) من شأنه مراقبة حدث ما ، وإذا حدث ذلك ، فسيقوم بإرسال رسالة Windows قياسية إلى تطبيق ما. سيتم تقديم مقبض التطبيق للخدمة بواسطة DLL يتم تفريغه بعد ذلك ، وبالتالي فإن رسالة Windows هي الطريقة التي نرغب في استخدامها.

على الرغم من ذلك ، فإن السؤال هو ما إذا كانت الخدمة تحتاج إلى القيام بأي شيء خاص لاستخدام SendMessage في مقبض النافذة ، بالنظر إلى أنه قد يكون على شاشة مختلفة أو شيء ما في Vista. هل هذا ممكن ، وإذا كان الأمر كذلك ، فماذا يجب أن أفعل من فضلك؟

هل كانت مفيدة؟

المحلول

عزل امتياز واجهة المستخدم (UIPI):

Microsoft Windows Vista ثم لاحقًا. يخضع إرسال الرسالة لعزل امتياز واجهة المستخدم (UIPI). لا يمكن لخيط العملية إرسال رسائل فقط إلى قوائم رسائل رسائل مؤشرات الترابط في عمليات مستوى السلامة الأقل أو متساوية.

مصدر

يمكنك أن تقرأ عن عزل امتياز واجهة المستخدم (UIPI) هنا.

للالتفاف على هذا ، يمكنك ضبط Uiaccess على True في ملفك البياني. يجب عليك أيضًا التأكد من توقيع التطبيق الخاص بك باستخدام Authenticode مع شهادة من سلطة التوقيع مثل Verisign. هذا يمكن أن يصبح مكلفا جدا.


الجلسة 0 العزلة:

من أؤمن أيضًا أنه لا يمكنك استدعاء SendMessage عبر الجلسات. لذلك إذا كان لديك خدمة تعمل في الجلسة 0 ، فيجب عليك العثور على وسيلة أخرى للتواصل مع عمليتك التي سيتم تشغيلها في جلسة> 0. مثال: عبر الأنابيب.

في Windows Vista و Windows 2008 Server وبعد ذلك يتم تشغيل جميع الخدمات في الجلسة 0 ، وجميع التطبيقات التي تبدأ تشغيلها في الجلسة> 0. وهذا ما يسمى العزل الجلسة 0. هنا وثيقة جيدة لها معلومات كل شيء عن العزلة جلسة 0.

إذا لم يكن لديك إمكانية الوصول إلى مصدر البرنامج الذي تريد إرسال رسائل إليه ، فيمكنك الالتفاف على هذا من خلال تقديم تطبيق يتواصل مع خدمتك ويعمل كبديل لنقل الرسالة إلى التطبيق في نفس جلسته .


شاملة:

إذا قمت بتطوير تطبيقك على ما قبل Vista ويعمل بشكل جيد. هناك عالي جدا فرصة سيتم كسرها في فيستا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top