IE URL Programm aus FAQ erweitern



  • Hi zusammen.

    Bin grad mal ein wenig durch die FAQs gestöbert und hab mir mal den Sourcecode von dem IE URL Prog angeschaut. Dann kam mir die Idee, nicht von einem bestimmten, sondern von alles offenen IE Fenster die URL zu bekommen.

    Soweit hab ich den Code schon "modifiziert"

    if(ie = ::FindWindow("IEFrame",NULL)) 
    	{ 
    		if(child = ::FindWindowEx(ie,0,"WorkerW",0)) 
    		{ 
    			if(child = ::FindWindowEx(child,0,"ReBarWindow32",0)) 
    			{ 
    				if(child = ::FindWindowEx(child,0,"ComboBoxEx32",0)) 
    				{ 
    					::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]); 
    					CString tmp = &buffer[0]; 
    					AfxMessageBox(tmp); 
    				} 
    			}                        
    		} 
    	}
    

    Funktioniert auch. Als Rückgabewert bekomme ich prima die URL. Einzigstes Problem bis jetzt: Da es ja ein child ist, wird logischer weise nur die URL vom letzten aktiven Fenster zurückgegeben.

    Wenn ich jetzt aber 2 oder 3 geöffnet habe, möchte ich aber auch von den anderen die URL haben. So zu sagen um einen (wie im IE schon bekannt) Verlauf zu erstellen.

    Jemand ne Idee? Ich steh grad bissl aufm Schlauch.



  • Ich weiß, ich habe irgendwo den Code um ALLE offenen IE Urls in einer Liste zu bekommen. Blos wo? 🙄
    PS: Da

    BOOL CFavoDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	::EnumChildWindows(::GetDesktopWindow(), EnumWindowsProc, (LPARAM)this);
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    BOOL CALLBACK CFavoDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam) 
    { 
        static char cbuff[256]="\0"; 
        static CString strClass, buff; 
        static DWORD dwPID=0; 
    
        // get window class name 
        ::GetClassName(hwnd, strClass.GetBuffer(_MAX_PATH), _MAX_PATH); 
    
        // get pid 
        ::GetWindowThreadProcessId(hwnd, &dwPID); 
    
        // get caption 
        ::GetWindowText(hwnd, cbuff, sizeof(cbuff)); 
    
        buff.Format("%s",cbuff); 
    // 	TRACE(buff+"\n");
    	int nIdx = buff.Find(" - Microsoft Internet Explorer");
    	if (nIdx > -1)
    	{
    		CFavoDlg* pDlg = (CFavoDlg*)lParam;
    		ASSERT(pDlg);
    		pDlg->m_lstUrls.AddString(GetUrl(buff));
    
    		pDlg->m_lstTitel.AddString(buff.Left(nIdx));
    	}
    
        // In buff stehen nun alle offnen Fenster drin 
        // Du musst nun einfach die Rausfiltern die MIE oder halt Opera 
        // Im Titel haben 
        // mit if und find arbeiten   
        return true; 
    } 
    
    CString CFavoDlg::GetUrl(CString f_strTitel)
    {
    	char buffer[256]; 
    	HWND child; 
    	HWND ie; 
    	if(ie = ::FindWindow("IEFrame",f_strTitel)) 
    	{ 
    		if(child = ::FindWindowEx(ie,0,"WorkerW",0)) 
    		{ 
    			if(child = ::FindWindowEx(child,0,"ReBarWindow32",0)) 
    			{ 
    				if(child = ::FindWindowEx(child,0,"ComboBoxEx32",0)) 
    				{ 
    					::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]); 
    					CString tmp = &buffer[0]; 
    // 					AfxMessageBox(tmp);
    					return tmp;
    				} 
    			}                        
    		} 
    	}
    	return "";
    }
    

    Bei Interesse kannste auch das Projekt haben. 🙂



  • brauchst nur noch entsprechend umzusetzen:

    #define STRICT
    #pragma comment( lib, "User32.lib" )
    
    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam );
    
    int main()
    {
    	if( !EnumWindows( EnumWindowsProc, 0 ))
    		cout << "Error enumerating windows: " << GetLastError() << endl;
    
    	return 0;
    }
    
    BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
    {
    	char buffer[1001], szClassName[256];
    	HWND child = NULL;
    
    	GetClassName( hWnd, szClassName, 255 );
    
    	if( strcmp( szClassName, "IEFrame" ) == 0 )
    	{
    		if(( child = ::FindWindowEx( hWnd, 0, "WorkerW", 0 )) != NULL ) 
    		{ 
    			if(( child = ::FindWindowEx( child, 0, "ReBarWindow32", 0 )) != NULL ) 
    			{ 
    				if(( child = ::FindWindowEx( child, 0, "ComboBoxEx32", 0 )) != NULL ) 
    				{
    					::SendMessage( child, WM_GETTEXT, 1000, (long)buffer ); 
    					cout << "URL: " << buffer << endl;
    				}
    			}
    		}
    	}
    
        return TRUE;
    }
    


  • cool 😮 👍



  • Ich hab den Aufruf in der OnInitDialog einfach mal in einen Timer gepackt. So wäre es doch theoretisch möglich, eine Log File zu schreiben. Man müsste vielleicht nur die schon geaddeten abfragen wegen doppeleintrag.

    --> Ja, das sollte man auf jedenfall tun, weil euch sonst die Listbox zuläuft *gg*

    hmm, das ist mal gar nicht so einfach:

    wie soll ich das am besten machen? nen string vergleich?



  • ich hab den code jetzt so modifiziert

    if ( pDlg->m_lstUrls.FindString(0,GetUrl(buff)) == CB_ERR )
    		{
    			pDlg->m_lstUrls.AddString(GetUrl(buff));
    			pDlg->m_lstTitel.AddString(buff.Left(nIdx));
    		}
    

    Ziel der Sache soll ne Logfile sein

    der Aufruf der in OnInitDialog passiert ist jetzt im Timer

    PROBLEM: bei eintippen der URL übernimmt er aber trotzdem alles



  • also wenn ich die abfrage jetzt so mache, updatet er aber auch die "unfertigen" URLs

    das einzigste, was mir jetzt einfallen würde ist, dass man die abfrage auf die Domainendungen macht ( .de, .com, .net ) etc wobei dann wieder das problem kommt, das ein eintrag mehrere male vorhanden ist

    hmmmm

    kann ich da nicht eine abfrage machen, die mir ne nachricht sendet, wenn im IE Enter oder Return gedrückt wird?

    denn dann würde ich erst dann das fenster abfragen und mir den string holen

    wenn man jetzt mal weiterdenkt könnte das noch richtig interessant werden. mal angenommen er geht auf www.google.de . diese URL wird dann als erste in die Logbox vom programm eingetragen. dann sucht er was und klickt auf die Links, diese dann aber auch in die logbox sollen, auch wenn er das im gleichen fenster macht. praktisch bis in die letzte linktiefe des benutzers alles mitloggen.

    oh man *gg*

    ein haufen arbeit.

    aber naja: meine frage nochmal: gibt es nicht so eine methode die ne nachricht sendet wenn im IE enter oder return gedrückt wird?

    oder hat sonst jemand ne andere idee wie ich den kompletten string bekomme wenn ich nen neues fenster öffne?

    im moment sieht es so aus:

    fenster öffnet sich --> benutzer tippt ein: www.google.de und programm trägt folgendes ein:

    w
    ww
    www
    www.
    www.g
    ....
    ....



  • Merk dir doch die letzten Abfrageergebnisse irgendwo extra und frag dann mit Find, welche fast identisch sind.

    CString strAlt = "www.g";
    CString strNeu " "www.go";
    if (strNeu.Find(strAlt) == 0) // gefunden
    {
    return;
    }
    if (strAlt.Find(strNeu) == 0) // gefunden (Backspacetaste)
    {
    return;
    }
    // Hier in die Liste packen
    

    Vielleicht sollte man auch noch nach der Länge abfragen, ob die sich um 1 unterscheidet - oder kann man schneller Tippen als dein Timer auslöst?



  • also das er schneller tippt als der timer läuft ist eher unwahrscheinlich, denn dann müsste er unter 1 ms schnell tippen *Gg*

    ist jetzt nur die frage, dass wenn ich das programm auf einen dienst umstelle, es die prozessorleistung beeinflusst



  • MSS-Software schrieb:

    also das er schneller tippt als der timer läuft ist eher unwahrscheinlich, denn dann müsste er unter 1 ms schnell tippen *Gg*

    Timer gehen nicht genauer als 50ms. ⚠



  • hää? dann macht der aus der übergebenen 1 praktisch den min wert 50 oder wie?



  • Der kann einfach nicht schneller. 😃


Anmelden zum Antworten