Im geöffneten Internet Explorer neue Seite laden



  • Hallo!

    Ich müsste aus einem C++ Programm überprüfen, ob der Internet Explorer offen ist - anschließend müsste ich ein bestimmtes IE-Fenster raussuchen und in diesem Fenster möchte ich dann eine Internetseite laden.

    wnd =  FindWindow("IEFrame", NULL);
    if(wnd!=NULL){
      MessageBox(NULL,"IE offen","Test",MB_ICONINFORMATION|MB_OK);
      HWND hwndWindow = FindWindow(NULL,TEXT("test - Microsoft Internet Explorer"));
      ShowWindow(hwndWindow,SW_RESTORE); // Restore
      SetForegroundWindow(hwndWindow);
    }
    

    Weiß jemand wie man ein bestimmtes IE-Fenster ansprechen kann ohne den kompletten Fensternamen anzugeben? Bei Kunden könnte ja evtl nicht ganz genau das stehen, was bei mir steht.

    Was aber noch viiiel wichtiger ist, wie kann ich etwas in der Seite laden lassen. Komm da einfach nicht weiter.

    Ich hoffe mir kann jemand weiterhelfen
    Viele Grüße
    Kathrin



  • Habe die Lösung jetzt selber gefunden:

    HWND            IEHandle,           AdressCB;
    
    IEHandle =  FindWindow("IEFrame", NULL);
    if(IEHandle != NULL){
    	if(AdressCB = ::FindWindowEx(IEHandle,0,"WorkerW",0))  {
    		if(AdressCB = ::FindWindowEx(AdressCB,0,"ReBarWindow32",0)) {
    			if(AdressCB = ::FindWindowEx(AdressCB,0,"ComboBoxEx32",0)){
    				if(AdressCB = ::FindWindowEx(AdressCB,0, "ComboBox", 0)){
    					if(AdressCB = ::FindWindowEx(AdressCB, 0, "Edit", 0)){									
    						::SendMessage(AdressCB,WM_SETTEXT, 0, (LPARAM)"www.google.de"); 
    						::SendMessage(AdressCB, WM_SETFOCUS, 0, 0);
    						::SendMessage(AdressCB, WM_KEYDOWN, VK_RETURN,0);
    						::SendMessage(AdressCB, WM_KEYUP, VK_RETURN,0);								
    					}
    				} 
    			}
    		}
    	}			 
    }
    

    Jetzt fehlt mir nur noch eine Funktion, in der ich auslesen kann, welche Internet Explorer Fenster offen sind. Suche nämlich eigentlich nach einem bestimmten Fenster. Jedoch möchte ich den kompletten Namen nicht fest setzen, sondern nach einem Teilstring suchen. Wenn da jmd einen Tipp hat, würde ich mich riesig freuen 🙂

    LG




  • Mod

    Deine Methode empfinde ich als falsch.

    Der IE hat ein COM Interface das man verwenden kann.
    Das ist weitaus zuverlässiger ujd garantiert dass es mit der nächsten IE Version auch funktioniert.



  • Hallo,

    also ich habe keine andere Funktion gefunden, du hast natürlich recht mit der Version.

    wie würde das denn mit dem COM Interface funktionieren? kenne mich leider nicht so gut aus

    Viele Grüße


  • Mod

    Ich kann Dir schwer COM erklären.

    Man kann sich von dem bestehenden Explorer das entsprechenee IWebBrowser2::Navigate Interface besorgen und damit die entsprechende Seite anfahren.

    http://msdn.microsoft.com/en-us/library/aa752133(VS.85).aspx



  • Bitte sehr:

    #include <mshtml.h>
    #include <exdisp.h>
    #include <oleacc.h>
    #include <shlguid.h>
    #include <stdio.h>
    #pragma comment(lib, "oleacc.lib")
    
    void HandleBrowser(IWebBrowser2 *browser)
    {
    	// get url
    	BSTR bstrUrl;
    	if (!browser->get_LocationURL(&bstrUrl) && bstrUrl)
    	{
    		_putws(bstrUrl);
    		SysFreeString(bstrUrl);
    	}
    	/*bstrUrl = SysAllocString(L"http://www.blah.com/");
    	browser->Navigate(bstrUrl,0,0,0,0);
    	SysFreeString(bstrUrl);*/
    }
    
    BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	TCHAR classname[64];
    	if (GetClassName(hwnd, classname, 64) && !_tcsicmp(classname, _T("IEFrame")))
    	{
    		HWND hwndSh = FindWindowEx(hwnd, 0, _T("Shell DocObject View"), 0);
    		HWND hwndIe = FindWindowEx(hwndSh, 0, _T("Internet Explorer_Server"), 0);
    
    		DWORD dwResult;
    		IHTMLDocument2 *document;
    
    		if (hwndIe && SendMessageTimeout(hwndIe, (UINT)lParam, 0, 0, SMTO_ABORTIFHUNG, 2000, &dwResult)
    		&& !ObjectFromLresult(dwResult, IID_IHTMLDocument2, 0, (void**)&document))
    		{
    			IServiceProvider *isp;
    			if (!document->QueryInterface(IID_IServiceProvider, (void**)&isp))
    			{
    				IServiceProvider *ispTop;
    				IWebBrowser2 *browser;
    				if (!isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, (void**)&ispTop))
    				{
    					if (!ispTop->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&browser))
    					{
    						HandleBrowser(browser);
    						browser->Release();
    					}
    					ispTop->Release();
    				}
    				else if (!ispTop->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&browser))
    				{
    					HandleBrowser(browser);
    					browser->Release();
    				}
    				isp->Release();
    			}
    			document->Release();
    		}
    	}
    	return TRUE;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CoInitialize(0);
    	IShellWindows *shwnd;
    	if (!CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER, IID_IShellWindows, (void**)&shwnd))
    	{
    		long count;
    		shwnd->get_Count(&count);
    		VARIANT vItem;
    		vItem.vt = VT_I4;
    		for (vItem.lVal=0; vItem.lVal<count; vItem.lVal++)
    		{
    			IDispatch *disp;
    			if (!shwnd->Item(vItem, &disp))
    			{
    				IWebBrowser2 *browser;
    				if (!disp->QueryInterface(IID_IWebBrowser2, (void**)&browser))
    				{
    					// quit for()
    					vItem.lVal = count;
    					HandleBrowser(browser);
    					browser->Release();
    				}
    				disp->Release();
    			}
    		}
    		shwnd->Release();
    	}
    	// oder
    	EnumWindows(MyEnumWindowsProc, (LPARAM)RegisterWindowMessage(_T("WM_HTML_GETOBJECT")));
    	CoUninitialize();
    	return 0;
    }
    


  • Wow - vielen lieben Dank! Das sieht ganz schön kompliziert aus 😮

    Habe erstmal nur die Include's aufgenommen und kompiliert und schon 2 Fehler erhalten 😞

    C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE\mshtml.h(26) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'IHTMLStyle'
    C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE\mshtml.h(26) : fatal error C1004: Unerwartetes Dateiende gefunden

    Habt ihr ne Idee woran das liegen könnte?
    LG



  • typedef interface IHTMLStyle IHTMLStyle; // Line 26
    

    Das ist C++ Code, nicht C!


Log in to reply