fremdes programm



  • Also das Fenster was ich anspreche gehört komplett nicht mir!!!
    Der Code um es anzusprechen läuft nur im thread.
    möchte nämlich die ganze zeit überwachen und wenns aufploopt solls beklickt werden 🙂

    Aber leider stürzt er entweder ab oder wartet mit dme anzeigen bis meine Routine geschlossen wird mpfh



  • Nochmal so ne frage , was sind denn genau deine intentionen ? wofür willst du nen zusätzlichen thread starten .. sind nicht eh alle Dialoge neue threads?
    willst du einzelne fkt in nen neuen thread packen und diese von mehreren dialogen aus steuern?



  • ok.. ich glaub jetzt verstehe ich was du willst ..
    du hast jetzt eine Hauptklasse + eine threadklasse in der threadklasse
    muss du mittels ener while(true) schleife checken ob dein fenster schon aufgepoppt ist .. direkt nach dem check musst du den thread schlafen legen mittels Sleep(500) //halbe sekunde zb .. dabei wird der prozessor an nen anderen thread abgegeben ..



  • Also noch mal:

    Ich habe eine Dialoganwendung + eine Threadklasse.
    In der Threadklasse läuft ne Schleife die guckt ob ein bestimmer (externer) Dialog schon da ist.
    Wenn ja soll er sich das Handel für den Button holen und klicken.

    Der Dialog der abgefragt wird, stammt aus einer anderen Anwendung.

    Es funzt auch wenn ich es manuel auf einen Button in meiner Dlg Klasse lege,jedoch nicht wenn ich es in die Thread Klasse packe



  • Habs Problem eingerenzen können.
    Scheint nicht der zugriff direkt zu sein sondern eher die schleife..

    Gibts ne Windows Message die man abfangen kann wenn ein neus Fenster aufgeht?



  • da ich selber mal dieses problem hatte(habe mit borland c++ zu dem zeitpunkt gearbeitet) sollte doch mein vorheriger vorschlag reichen

    main{
      while(true)
      {
         //checken ob fenster handle ungleich null
          ..
        // dann schlafen legen
         Sleep(500);
       //und ggf. programmm beenden
        // if( fenster handle gefunden ) break;
      }
    }
    


  • Gut und bei dir hats hingehauen??
    Bei mir nicht ganz so wie es soll...

    Mhhh

    while(true)
    {
          CWnd *fenster = fenster->FindWindow(NULL,"Progg");
          if(fenster != NULL)
          {
    	    Sleep(500);
    	    CWnd *button  = fenster->GetDlgItem(4774);
    	    if(button != NULL)
    	    {
    	           button->SendMessage(BM_CLICK,0,0);
    	    }
          }
    }
    

    so?

    auch hier wieder. Fenster Titel oder so kann geändert werden. nur wieder das prob mit dem button zu griff.

    (p.s: das fenster wiederholt sich hintereinander mehrere male)

    ich geh noch kaputt daran 😮

    Hab gerade mal getestet, edn Titel des Buttons kann ich änderen von daher ist der Handel richtig



  • hm..
    wiegesagt hatte das mal unter borland c++ so gemacht ..

    was mir aufgefallen ist ..
    1.)du solltest CWnd *fenster , *button aus der while schleife ziehen..
    2.)woher sollen denn button wissen das er ein button ist und nicht ein CWnd*?

    [cpp]
    CWnd *button = **(*button)**fenster->GetDlgItem(4774);
    [/cpp]



  • DAs Merkwürdige ist ja das diese Code funzt :

    CWnd *button,*fenster;
    fenster = fenster->FindWindow(NULL,"Progg");
    if(fenster != NULL)
    {
    	Sleep(500);
    	button = fenster->GetDlgItem(4774);
    	if(button != NULL)
    	{
    		button->SendMessage(BM_CLICK,0,0);
    	}
    }
    

    Nur sobald das Ding in einer Schleife läuft eben nicht...
    Ich vermute start das es damit zusammen hängt das der Dialog der beklickt werden soll, nach dem schliessen nochmals aufgerufen wird...



  • morgens ,
    wenn deine letzte these stimmt , dann verschiebe doch das Sleep (also nach if()mit dem button)



  • ja das hab ich gemacht, zumindest schmiert er jetzt nicht mehr ab wenn ich händisch den anderen dialog klicke.

    Das SendMessage wird auch ausgeführt, nur leider scheint er da nicht drauf zu regaieren. (Jedoch funzt es mit dem selben code, wenn ich es per button manuell mache)



  • Jau, also jetzt ist es ziemlich sicher.
    Das Problem wird sein, das das Fenster nach dem Klick gleich wieder aufgeht.
    Habs gerade mit nem anderen Tool probiert (von codeguru) und musste auch einmal die anzeige liste refreshen bevor er die MSG ein zweitesmal genommen hat.

    da schient also das prob zu liegen...

    gruss
    christian



  • versuchmal postmessage zu verwenden .. ich meine mich zu erinnern dass ich auch mal mit einem von beiden ein problem hatte ..



  • ja habs gerade mal gemacht.
    problem tritt nur dann auf wenns inner schleife ist (auch mit sleep)
    sehr komisch.
    Hab meine Code verändert:

    BOOL CALLBACK CTestDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
    {
    	static char cbuff[256]="\0";
    	static CString strClass, buff;
    	static DWORD dwPID=0;
    
    	::GetClassName(hWnd, strClass.GetBuffer(_MAX_PATH), _MAX_PATH);
    
    	::GetWindowThreadProcessId(hWnd, &dwPID);
    
    	::GetWindowText(hWnd, cbuff, sizeof(cbuff));
    
    	buff.Format("%s",cbuff);
    
    	if(buff == "Progg")
    	{
    		HWND button = ::GetDlgItem(hWnd,4774);
    		::PostMessage(button,BM_CLICK,0,0);
    	}
    
    	return true;
    }
    
    /////////////////////////////////////////////////
    //Aufruf
    ::EnumChildWindows(::GetDesktopWindow(),EnumWindowsProc, (LPARAM)this);
    

    Klappt auch wunderbar sofern ich den Aufruf manuell mache..
    Wenns über die Schleife im Thread läuft funzt wieder net



  • wuTangl schrieb:

    hm..
    wiegesagt hatte das mal unter borland c++ so gemacht ..

    was mir aufgefallen ist ..
    1.)du solltest CWnd *fenster , *button aus der while schleife ziehen..
    2.)woher sollen denn button wissen das er ein button ist und nicht ein CWnd*?

    [cpp]
    CWnd *button = **(*button)**fenster->GetDlgItem(4774);
    [/cpp]

    Falsch!!
    Mal abgesehen davon dass ein Cast nach *button ohnehin absoluter Mumpitz ist liefert GetDlgItem ein CWnd* !! Und das Objekt dass dahinter steht ist auch ein CWnd!! Genau genommen ein Objekt der Klasse CTempWnd...
    Da kannst du casten bis der Arzt kommt....

    MfG Spacelord


Anmelden zum Antworten