FAQ-Vorschlag: steuern von fremden Programmen, Spy++-Benutzung



  • Für diejenigen, die es auch mal versuchen wollen:
    Habe mal ein eigenes kleines mfc mit button erstellt, den ich drücken lassen
    will (bei Wintv funzt es irgendwie nicht).
    Hier der Code dafür:

    void CSendmessage_testDlg::OnButton3() 
    {
    	if(FindWindow(NULL, "test"))
    	{
    		CWnd *gefundenesfenster=FindWindow(NULL, "test"), *derbutton=gefundenesfenster->GetDlgItem(0x1);
    
    		gefundenesfenster->SetForegroundWindow();
    		Sleep(1);
    		::SendNotifyMessage(derbutton->m_hWnd,BM_CLICK,0,0);
    		this->SetForegroundWindow();
    	}
    	else
    	{
    		AfxMessageBox("Programm nicht geöffnet");
    	}
    
    }
    

    Das Sleep(1) hab ich eingebaut, da ohne das Drücken des Buttons hakelt.
    Nicht schön aber es funktioniert!



  • Bist du sicher, das Wintv in MFC geschrieben ist ?

    Devil



  • Ne, bin ich nicht.
    Würde mich aber trotzdem interessieren, wie man solche Progs fernsteuern kann.
    Um evtl. ne eigene IR-Software oder so zu tippeln



  • Mich würde mal interressieren wie man mit FindWindow() zugriff auf Webbrowserfenster bekommt.

    FindWindow(NULL, "Mozilla") //oder
    FindWindow(NULL, "Microsoft Internet Explorer")
    

    funktionieren da ja leider nicht weil die browser ja den Fenstertitel ändern, zB. zu

    C++Forum - Mozilla

    dann müsste man ja den Aufruf so machen:

    FindWindow(NULL, "C++Forum - Mozilla")
    

    aber das bringt ja nichts, kann man die Browser nicht irgendwie doch "zu fassen bekommen" 😕 ?

    Matthias



  • @maty

    Das geht AFAIK über die Steuerelement-ID.



  • Hi Maty,
    hab mal ein wenig rumgespielt...
    versuch das hier mal:

    CWnd* browser;
    
    	if(CWnd::FindWindow("IEFrame",NULL)!=NULL)
    	{
    		browser=CWnd::FindWindow("IEFrame",NULL);	
    
    		//nur um zu testen, ob er den Window auch gefunden hat
    		browser->SetForegroundWindow();			
    	}
    	else
    	{
    		AfxMessageBox("Internetexplorer nicht geöffnet");
    	}
    

    simultan für Mozilla:

    CWnd* browser;
    
    	if(CWnd::FindWindow("MozillaWindowClass",NULL)!=NULL)
    	{
    		browser=CWnd::FindWindow("MozillaWindowClass",NULL);	
    
    		//nur um zu testen, ob er den Window auch gefunden hat
    		browser->SetForegroundWindow();			
    	}
    	else
    	{
    		AfxMessageBox("Mozilla nicht geöffnet");
    	}
    

    VG!



  • Super, Bummsfallera 😃

    das klappt ja einwandfrei - Vielen Dank !!!!!!!!!

    ah, das heist man kann auch nach dem Klassennamen suchen - das wuste ich nicht.
    Jetzt bräuchte ich nur noch den Schreib/Lese Zugriff auf die Eingabefelder für die Urls ...

    Matthias



  • Hi,
    habe folgendes gefunden, um den text "Hallo WorkPad" in das Edit-Feld
    des Wordpad zu schreiben. Müsste also eigentlich auch beim URL-Feld funzen
    evtl. mal das kombi-element anschauen/suchen.
    Hab leider heute keine Zeit mich selbst hinzusetzen, da ich in den Klausuren
    stecke.
    Ich hoffe das hilft dir ein wenig....
    Bis denne, vg!

    CWnd* pWnd = FindWindow(NULL,"Dokument - WordPad");
    if(pWnd) {
       HWND hWnd;
       pWnd->GetDlgItem(0xE900, &hWnd);
       ASSERT(IsWindow(hWnd));
       CWnd* pCtrl = (CWnd*)CWnd::FromHandle(hWnd);
       ((CRichEditCtrl*)pCtrl)->ReplaceSel("Hallo WorPad");
    }
    


  • Danke das Du Dir die Zeit genommen hast 😉 .

    Werd mal versuchen das hinzubekommen.

    übrigens bei Netscape 4.7 klappt das nicht - Spy hatt da als Klassennamen
    "Afx:400000:b:10011:6:d02c3" und beim nächsten mal heist der "Afx:400000:b:10011:6:d02c3", der ist auch gültig aber der ändert sich eben jedesmal. Kann ich auch irgendwie das Handle des Aktiven(Focus) Fenster bekommen - vileicht klappt es damit ... ?

    Noch alles gute für Deine Klausuren, Bummsfallera 🙂



  • Du, kein Problem! Bin ja schliesslich auch froh wenn mir jemand hilft.
    Wegen Netscape weiss ich leider nicht, sowas kommt mir nicht mehr auf
    meinen Rechner.



  • naja manche haben es ja noch - ich benutze nur Mozilla.
    Man müsste an das aktuelle Fenster kommen und von ihm den Titel auslesen und vergleichen ... und sich dann das handle schnappen.

    Ich hoffe ich kann Dir auch mal helfen 🙂



  • Da bin ich mir sicher...hast 100€? 😃 😃 😃 😃
    Also viel spass und hau rein!



  • klaro, für dich immer - wenn Du mir weiter so hilfst 😉



  • Ach ja, bevor ich es vergesse:
    Wenn du die lösung gefunden hast, kannst du sie dann bitte in diesem Thread
    posten? Mich würde das auch interessieren -> DANKE! 😉



  • ja, aber ich hoffe das mir noch wer helfen kann, das aktive Fenster zu bekommen.

    Soll ja irgendwie mit:

    FINDWINDOWHANDLESTRUCT fwhs;
    fwhs.ProcessInfo = lpProcessInformation;
    fwhs.hWndFound  = NULL;
    
    EnumWindows ( EnumWindowCallBack, (LPARAM)&fwhs ) ;
    

    gehen aber ich bekomm nur Fehler
    Die FINDWINDOWHANDLESTRUCT kann ich nicht in der msdn hilfe(VS6) finden - blick da nicht so durch 😞



  • verstehe ich nicht, welches aktive fenster?
    versuchst du immer noch auf das CEdit des IE zuzugreifen oder
    willst du allgemein den aktuellen Vordergrund-Window bekommen?



  • ja genau, den für das vordergrund-windows.

    hab hier gerade die funktion GetActiveWindow() gefunden, da steht aber:

    ... wird der Handle des aktuell aktiven Fenster, das dem aufrufenden Thred zugeordent ist, zurückgegeben ...

    Also bekomme ich mein eigenes Fensterhandle - das bringt ja nichts , oder ?


Anmelden zum Antworten