سؤال

حتى الآن, لقد استخدمت بنجاح الدالة التالية لاسترداد 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

نصائح أخرى

زوجين من النهج البديلة قد يكون:

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