كيف تحدد متى تكون العملية جاهزة؟ (باستخدام CreateProcess () و bindwindow ())

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

  •  29-09-2019
  •  | 
  •  

سؤال

يجب أن يكون هذا سهلاً: أقوم بإنشاء برنامج يولد عملية باستخدام Win32 CreateProcess() وظيفة. بمجرد تحميل هذه العملية ، أجد نافذتها باستخدام FindWindow وأرسلها رسائل باستخدام SendMessage(). السؤال هو، كيف أعرف عندما تكون تلك النافذة جاهزة لقبول الرسائل؟

النظر في ما يلي:

HWND wnd;

BOOL Start()
{
  // Spawn the process
  if (! CreateProcess(...))
    return FALSE;

  // Find the process's window (class and name already known)
  wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);

  // Always returns FALSE because window has not yet been created.
  return (wnd != NULL);
}

الرمز أعلاه سيفشل (تقريبًا؟) دائمًا ؛ لا يمكن إنشاء النافذة وتجد ذلك بسرعة. إذا وضعت موضوع انتظر ، قل Sleep(1000), ، بين ال CreateProcess و FindWindow المكالمات ، فهي تعمل بشكل جيد. لكن هذا يبدو وكأنه أ جداً اختراق سيء.

كيف يمكنني تحسين هذا؟

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

المحلول

(يحرر): مستخدم iinsable أشار المشاكل مع WaitForInputIdle(), ، واقترح خطافات CBT في حين أن.

(...) وظيفة رد الاتصال المستخدمة مع Setwindowshookexوظيفة. يستدعي النظام هذه الوظيفة قبل التنشيط ، وإنشاء ، (...) نافذة ؛ (... أشياء كثيرة أخرى).

أيضا ، CBT قصير للتدريب القائم على الكمبيوتر ، لأي سبب من الأسباب.

(قديم ، احذر ، انظر التعليقات.) أنت تبحث عن waitforinputidle (). يقتبس:

عندما تنشئ عملية الوالدين عملية طفل ، تعود وظيفة CreateProcess دون انتظار عملية الطفل لإنهاء تهيئتها. قبل محاولة التواصل مع عملية الطفل ، يمكن لعملية الوالدين استخدام وظيفة Waitforinputidle لتحديد متى تم إكمال تهيئة الطفل.

نصائح أخرى

هل نظرت إلى waitforinputidle?

إذا كانت العملية التي تبدأها هي عملية يمكنك تغييرها ، فاطلبها إرسال رسالة إلى الوالد عندما تكون جاهزة. يمكنك تمرير HWND من الوالد كمعلمة سطر الأوامر ، أو استخدام FindWindow إذا كنت تستطيع ضمان أن يكون الوالد فريدًا.

أفترض أن الكود المصدري لكلا العمليتين يخضعون لسيطرتك.

  • يمكنك السماح للعملية الثانية بنشر رسالة إلى الأولى عندما تكون جاهزة ، إذا كان الثاني يعرف التفاصيل المطلوبة لنافذة رسالة العملية الأولى.
  • أو يمكنك الانتظار في العملية الأولى لكائن المزامنة المسمى ، مثل الحدث أو Mutex ، يتم تعيينه من العملية الثانية.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top