سؤال

أقوم بإنشاء تطبيق مع نافذته الرئيسية مخفية باستخدام الكود التالي:

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));

siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;

if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)  
{
 // blah    
 return 0;
}

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

هل هناك أي طريقة لتجنب هذا؟ علاوة على ذلك ، هل هناك أي طريقة لإنشاء عملية أخرى دون استخدام CreateProcess (أو أي من واجهة برمجة التطبيقات التي تستدعي المعالجة CreateProcess مثل Shellexecute)؟

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

لأولئك منكم الفضوليين الذين سيسألون بالتأكيد المعتاد "لماذا تريد أن تفعل هذا" ، جوابي هو أن لدي عملية مراقبة لا يمكن أن تكون خدمة وتبدأ كلما فتحت طلبي الرئيسي. راضي؟

شكرا للمساعدة. سيتم تقدير الكود. جيس.

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

المحلول

التطبيق الذي تقوم بتشغيله هو أخذ تركيز النافذة.

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

يجب أن يبدو الرمز المطلوب تشغيل عملية على سطح مكتب جديد مثل هذا:

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );

نصائح أخرى

من الواضح أن التطبيق المستهدف لا يكرم أعلام showwindow. تحتاج إلى إصلاح التطبيق الذي تم إطلاقه بحيث لا يكون جشعًا.

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