سؤال

أريد أن أعرض بعض الرسومات المخصصة أعلى تطبيق Windows Fullscreen Fullscreen.

هل لعبت أي ألعاب Steam؟ لديها ملف قابل للتنفيذ، gameOverlayui.exe الذي يتيح لك الوصول إلى نوافذ البخار من داخل لعبة. (تبدو عناصر واجهة المستخدم الرسومية مرسومة مخصصة، لا أعرف ما إذا كانت هذه ضرورة؛ لكنها تبدو نفسها بالضبط داخل اللعبة كما يفعلون على سطح المكتب.) حتى الآن على "خافت" رسومات اللعبة في الخلفية.

أنا أتساءل كيف يمكن للمرء أن يكتابة مثل هذا التطبيق.

أنا أيضا أتساءل كيف سيكون نطاق الحلول الواسع. هل يمكنك استخدام طريقة واحدة لجميع تطبيقات OpenGL؟ لجميع تطبيقات Direct3D ناقص DirectDraw؟ لجميع تطبيقات ويندوز ملء الشاشة؟

أبحث عن المزيد من الحلول الحديثة والأجنحة - تراكب موجه الأوامر أو تطبيق ألوان مفهرف 320x240 ليس مصدر قلق.

تحرير: بعض التوضيح: تطبيق ملء الشاشة ليس لي. يمكن أن يكون أي شيء. على الأرجح، ستكون لعبة ثلاثية الأبعاد. أريد عرضها، قل ساعة رقمية في الركن الأيمن السفلي من الشاشة، أعلى رسومات اللعبة. أرغب في تجنب الحيل مثل قانون الحقن أو تصحيح الأخطاء، إن أمكن.

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

المحلول

حسنا، إليك مثال آخر. Xfire هو برنامج دردشة يتراكم واجهته في الألعاب حتى تتمكن من تلقي الرسائل أثناء اللعب. الطريقة التي يقوم بها بذلك هي تحرير D3D / OpenGL DLL على مستوى ذاكرة العملية، مثل القفزات التجميع في الحقن. أعلم أن هذا لأن طريقتهم كانت تسببت في تحطم وزارة الدفاع الخاصة بي، ورأيت فعلا رمز التجميع الغريب الذي تم حقنه في D3D9.dll.

حتى هنا كيف Xfire يفعل هذا:

  1. استهدف عملية اللعبة
  2. ابحث في ذاكرة العملية الخاصة به ل d3d.dll / opengl.dll
  3. ضخ في العملية DLL التي تحتوي على منطق واجهة مخصصة
  4. توصيل وظائف الواجهة في تدفق البرنامج عن طريق كتابة الجمعية يدويا يقفز في وظائف D3D / OpenGL الموجودة في ذاكرة العملية

لا توجد طريقة أخرى يمكن تصورها لأنك تحتاج إلى اختطاف جهاز الرسومات الذي ينتمي إلى هذه اللعبة. أنا على استعداد للمراهنة أن البخار يفعل ذلك بنفس الطريقة مثل Xfire. لذلك نعم، لا طريقة سهلة للقيام بذلك إلا إذا قام شخص ما بإنشاء مكتبة مفيدة للقيام بكل ما تحتاج إلى القيام به على المستوى المنخفض.

سئلت أيضا عن تعتيم رسومات اللعبة تحت تراكبك. هذا مجرد بسيط DrawPrimitive اتصل لرسم مستطيل شفاف ملء عبر الشاشة.

نصائح أخرى

خلق جوهري مع الكود الكامل هنا

هذا فن باطني جميل، وهناك عدة طرق للقيام بذلك. انا افضل ما يسمى غلاف Direct3D.. وبعد لقد مرت سنوات منذ أن قمت بذلك، لكنني فعلت ذلك مع لعبة مرة واحدة. ربما أترك بعض التفاصيل، لكنني آمل أن أوضح الفكرة.

جميع ألعاب Direct3D9 تحتاج إلى الاتصال idirect3device9 :: EndScene. بعد تقديم الشاشة وعلى استعداد ليتم رسمها. لذلك من الناحية النظرية، يمكننا وضع رمز مخصص في الداخل EndScene الذي يرسم ما نريده خلال اللعبة. نقوم بذلك عن طريق إنشاء فئة يشبه IDirect3DEVICE9 إلى اللعبة، ولكنها حقا مجرد غلاف يدرج جميع مكالمات الوظيفة إلى الطبقة الحقيقية. حتى الآن، في فئة مخصصة لدينا، وظيفة المجمع لدينا ل EndScene يشبه هذا:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

ثم تجميعها في DLL يسمى D3D9.DLL، وإسقاطها في دليل اللعبة القابل للتنفيذ. يجب أن يكون D3D9.DLL الحقيقي في مجلد / System32، لكن اللعبة تبحث أولا في الدليل الحالي، وبدلا من ذلك تحميل لنا. بمجرد تحميل اللعبة، يستخدم DLL لدينا لإنشاء مثيل لفئة المجمع لدينا. والآن في كل مرة EndScene يسمى، يتم تنفيذ التعليمات البرمجية لدينا لرسم ما نريد الشاشة.

أعتقد أنه يمكنك تجربة نفس المبدأ مع OpenGL. ولكن لمنع العبث، أعتقد أن بعض الألعاب الحديثة تحاول منع هذا.

ثمرين مشروع برمجيات مجانية اسمه هو Taksi رابط النص. وبعد لست متأكدا من كيفية تجاوز هذا التطبيق العملية لأنني أفحص الرمز حتى الآن لكن Checkit أعتقد أن هذا مشروع جيد

لقد كنت أفكر في هذا. بالنسبة إلى OpenGL، سأقوم بانكطلاع برامج WGL باستخدام Detours، ورسم أشيائي بعد اللعبة ثم قم بإزالة المخازن المؤقتة بنفسي.

لقد فعلت التراكبات مع كل من DirectX & WPF Viewports (نفس الشيء، حقا)، باستخدام التراكب لطلاء بعض الأشياء اللطيفة 2D GDI + على رأس الكتور ثلاثية الأبعاد.

تمكنت من خلال استخدام لوحة أعلى التصور "الفعلي"، وضع اللون للشفافية باستثناء البتات التي أردت التراكب. عملت بشكل جيد للغاية، لكنها كانت صغيرة من الألم النقر، واسحب، والأحداث الأخرى من خلال طبقة "الرسم" إلى عنصر تحكم ثلاثي الأبعاد.

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