كيفية العثور على IWebBrowser2 مؤشر على IE8 نافذة معينة PID?
-
22-07-2019 - |
سؤال
حتى الآن, لقد استخدمت بنجاح الدالة التالية لاسترداد IWebBrowser2 مؤشر إلى تشغيل Internet Explorer سبيل المثال ، في ضوء PID.
static SHDocVw::IWebBrowser2Ptr findBrowserByPID( DWORD pid )
{
SHDocVw::IShellWindowsPtr ptr;
ptr.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if ( ptr == NULL ) {
return 0;
}
// number of shell windows
const long nCount = ptr->GetCount();
// iterate over all shell windows
for (long i = 0; i < nCount; ++i) {
// get interface to item no i
_variant_t va(i, VT_I4);
IDispatchPtr spDisp = ptr->Item(va);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser != NULL) {
// if there's a document we know this is an IE object
// rather than a Windows Explorer instance
HWND browserWindow;
try {
browserWindow = (HWND)spBrowser->GetHWND();
} catch ( const _com_error &e ) {
// in case ->GetHWND() fails
continue;
}
DWORD browserPID;
GetWindowThreadProcessId( browserWindow, &browserPID );
if ( browserPID == pid ) {
return spBrowser;
}
}
}
return 0;
}
ما أقوم به هو إطلاق explorer.exe
العملية عن طريق CreateProcess
ثم استخدم الدالة أعلاه لاسترداد IWebBrowser2Ptr إلى ذلك (حتى أنا كمان مع المتصفح).
للأسف, لا يبدو للعمل مع إنترنت إكسبلورر 8 بعد الآن ، منذ IE8 يبدو أن إعادة استخدام العمليات - على الأقل إلى حد ما.لمدة سنتين تسلسل رمز مثل:
PROCESS_INFORMATION pi;
// ...
if ( CreateProcess( ..., &pi ) ) {
// Wait a bit to give the browser a change to show its window
// ...
IWebBrowser2 *pWebBrowser = findBrowserByPID( pi.dwProcessId );
}
الجولة الأولى من هذا القانون يعمل بشكل جيد ، والثاني لم تمكن من استرداد pWebBrowser النافذة.
بعد قليل من التصحيح, تم الكشف عن أن findBrowserByPID
وظيفة لا تجد الكثير من متصفح ويندوز (و يجدها أكثر بعد بدء الثانية المتصفح سبيل المثال), ولكن لا أحد منهم ينتمي إلى حديثا بدأت عملية.يبدو أن جميع النوافذ تنتمي إلى الأول أي العملية التي بدأت.
هل يعرف أحد طريقة بديلة للحصول على IWebBrowser2 مؤشر إلى بعض IE8 سبيل المثال ؟ أو ربما هناك طريقة لتعطيل هذه الظاهرة 'إعادة' من العمليات مع IE8?
المحلول
إذا كنت اطلاق عملية IE نفسك، لا تستخدم CreateProcess-- بدلا من ذلك، استخدام CoCreateInstance. وهذا يعود لك الكائن الذي يمكنك الاستعلام عن IWebBrowser2، والتي يمكنك استخدامها في الإرادة. تعقيد واحد هو أنه إذا كان التنقل يعبر مستويات النزاهة (فيستا +) والمؤشر يصبح غير صالح. لمعالجة هذه المشكلة، مزامنة الحدث NewProcess، والتي سوف تسمح لك للكشف عن هذا الشرط.
وانظر بعض مزيد من المعلومات هنا: HTTP: / /msdn.microsoft.com/en-us/library/aa752084٪28VS.85٪29.aspx
نصائح أخرى
زوجين من النهج البديلة قد يكون:
استخدام المكتبة مثل WatiN التي قد تساعدك على القيام بكل ما اسمك الحقيقي الهدف هو إذا كنت تحاول أتمتة أي.