جلب النافذة إلى المقدمة في C# باستخدام Win32 API

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

  •  08-06-2019
  •  | 
  •  

سؤال

أنا أكتب تطبيقًا يحتاج إلى جلب نافذة تطبيق خارجي إلى المقدمة، وليس بالضرورة سرقة التركيز (هناك إعداد يمكن للمستخدم تبديله لسرقة/عدم سرقة التركيز).

ما هي أفضل طريقة للقيام بذلك باستخدام Win32 API؟لقد قمت بتجريب SetForeground() ولكنه دائمًا ما يسرق التركيز ولا يعمل بشكل متسق.

ما هي أفضل طريقة للقيام بذلك؟أي أفكار؟

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

المحلول

من المفترض أن يسرق SetForegroundWindow التركيز، وهناك حالات معينة سيفشل فيها.

تقوم وظيفة SetForegroundWindow بوضع الخيط الذي أنشأ النافذة المحددة في المقدمة وتقوم بتنشيط النافذة.يتم توجيه إدخال لوحة المفاتيح إلى النافذة

حاول التقاط التركيز باستخدام SetCapture قبل إجراء المكالمة.انظر أيضًا إلى الطرق المختلفة لجلب النافذة إلى المقدمة:يمكن لـ SetForeGroundWindow وSetActiveWindow وحتى محاكاة النقر بالماوس القيام بذلك.

نصائح أخرى

ما الفرق بين SetForeGroundWindow وSetActiveWindow وBringWindowToTop؟ويبدو كما لو أنهم جميعا يفعلون نفس الشيء.

وفقًا لـ MSDN، سيقوم SetForeGroundWindow بتنشيط النافذة وتوجيه تركيز لوحة المفاتيح إليها.يحاول هذا العمل حتى عندما تكون العملية في الخلفية.يقوم SetActiveWindow بنفس الشيء الذي يقوم به SetForeGroundWindow، لكنه لا يفعل أي شيء إذا لم يكن التطبيق الخاص بك هو التطبيق الأمامي.أخيرًا، يؤدي تطبيق BringWindowToTop إلى رفع النافذة إلى الأعلى فقط، ولا يغير تركيز لوحة المفاتيح.

يمكنك تجربة وظيفة BringWindowToTop حتى لا تسرق التركيز.لم أستخدمه، ولكن يبدو أنه ما تبحث عنه.

هل حاولت استخدام SetWindowPos.هذه هي الوظيفة الأساسية لنقل الترتيب z وتغيير حجمه وتعيينه في نظام التشغيل Windows.هناك علامة SWP_NOACTIVATE يمكنك استخدامها.ينظر الى http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx.لم أجرب هذا على نافذة تنتمي إلى عملية أخرى، ولكن ربما يستحق الأمر المحاولة.

SetWindowPos + SWP_NOACTIVATE يقوم بالمهمة.

يمكنك استخدام FindWindow للحصول على HWND للنافذة، ثم استخدام وظيفة BringWindowToTop الموجودة في Win32 API.

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