كيف يمكنني استخدام PostThreadMessage ليغلق إنترنت إكسبلورر من C ++
-
07-07-2019 - |
سؤال
وأنا أحاول أن تبدأ iexplore.exe
السماح لها تشغيل لمدة 5 ثوان ثم إغلاقه مرة أخرى.
وiexplore
يفتح على ما يرام إلا أنه لا يغلق عند استدعاء PostThreadMessage.
يمكن لأي شخص رؤية ما أفعله خطأ؟ هنا هو رمز بلادي:
CString IEPath = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";//GetIEPath();
//IEPath += ' ' + url;
std::string strCommand((LPCTSTR)IEPath);
PROCESS_INFORMATION procinfo;
STARTUPINFO startupinfo;
GetStartupInfo(&startupinfo);
CreateProcess(
NULL,
(char *)strCommand.c_str(),// name of executable module
NULL, // lpProcessAttributes
NULL, // lpThreadAttributes
false, // handle inheritance option
CREATE_SHARED_WOW_VDM, // creation flags
NULL, // new environment block
NULL, // current directory name
&startupinfo, // startup information
&procinfo // process information
);
Sleep(5000);
::PostThreadMessage(procinfo.dwThreadId, WM_QUIT, 0, 0); //<---Dosent Close internet explorer!
وأي شخص لديه فكرة عما أفعله خطأ؟ أم أن هناك طريقة أفضل ما لتفعل خدعة؟
المحلول
وإذا كان يمكنك تعداد النوافذ على سطح المكتب وإرسال WM_CLOSE إلى إطار IE، فإنه قد عمل .. يمكنك استخدام برنامج التجسس للحصول على الدرجة نافذة نافذة IE
نصائح أخرى
ما هي قيمة الإرجاع من استدعاء PostThreadMessage؟ قد تعطي فكرة.
وبالنسبة لي، وهذا يعمل الكمال:
TerminateProcess(procinfo.hProcess, 0);
وحاول إرسال WM_CLOSE إلى الإطار الرئيسي (المستوى الأعلى). وهذا ما يعادل العادي الخروج على Alt-F4.
وأنا لا أملك جوابا على وجه التحديد لماذا PostThreadMessage لم تنجح. ولكن، ربما إذا كنت توضيح لماذا تريد أن تفعل هذا، هناك حل أفضل؟
وعلى سبيل المثال، إذا كنت ترغب فقط في عرض صفحة ويب لمدة 5 ثوان، يمكنك إنشاء وتظهر نافذة الخاص بك مع عنصر تحكم ActiveX مستكشف الإنترنت جزءا لا يتجزأ. عليك أن تكون أيضا قادرة على إضافة بالوعة للكشف عندما صفحة ويب تم تحميله في عنصر تحكم ActiveX، بحيث يمكنك بدء الخاص بك عداد 5 ثانية فقط بعد تحميل صفحة الويب وعرضها.
وانتهى بي الأمر القيام سردا للنوافذ (كما اشابيل من التي ذكرتها يجب أن أقوم به) أنا استلهم من http://simplesamples.info/Windows/EnumWindows.php .
لا تستخدم PostThreadMessage ()، والذي يرسل رسالة إلى موضوع محدد في عملية الهدف بدلا من عملية 'ويندوز مضخة رسالة. استخدام PostMessage () أو SendMessage () بدلا من ذلك، الذي وضع الرسالة في ويندوز مضخة رسالة عملية الهدف - وهو بالضبط ما تريد
لا، أبدا استخدام SendMessage () (المادة Win32 والأساسية) لا تستخدم EnmWindows () (الرهيبة)