Anwendung aus anwendung starten



  • moin,

    hat sich erledigt so wie heute morgen beschrieben mach ich es nicht, ich mach es so wie gestern.
    mitlerweile zeigt er jeine fehlermeldung mehr an, aber deswegen bleibt das hprog nicht da.
    naja da wird sich noch ne lösung finden lassen.... 🙄



  • Es sieht so aus als wenn er immer wenn er an diese stelle kommt alles schliesst:

    pCwnd->SetForegroundWindow();
    

    WEnn ich es weg lasse setzt er es wieder hinter die ganzen anderen fenster!!
    weiss jemand was anderes das ich für SetForegroundWindow(); einsetztem kann,
    ich habe schon einige probiert bei denen auch immer das gleiche passiert gleiche passiert........ aber das richtige habe ich noch nicht.



  • Das Fenster wird definitiv mit SetForgroundWindow in den Vordergrund geholt.

    Dein Problem liegt warscheinlich daran, dass er das Fenster nicht gefunden hat.

    Teste mal, ob der Zeiger auf das Fenster (CWnd) NULL ist.
    Das kann nämlich der Fall sein, wenn er das Fenster mit FindWindow nicht gefunden hat. Solltest Du eh auf jeden Fall absichern, da sonst immer die Gefahr besteht, dass Dir Dein Prog an der Stelle abschmiert.

    Manche Anwendungen benötigen auch eine gewisse Zeit zum Laden und dann findet er das Fenster noch nicht, wenn FindWindow unmittelbar nach WinExec oder ShellExecute aufgerufen wird. Vielleicht hilft ein Sleep zwischen WinExec und FindWindow.



  • Hallo,

    das testen kann ich doch so oder:

    if( pCwnd ==NULL)
    			MessageBox("Nix");
    		else
    			MessageBox("es geht");
    

    in dem fall gibt er nämlich "Nix" zurück......



  • Richtig. Also ist der Zeiger NULL, damit crashts beim Aufruf von SetForegroundWindow

    Willst Du SetForegroundWindow ausführen, sichere es ab:

    if (pCwnd)
      pCwnd->SetForegroundWindow();
    

    Er hat also das Fenster nicht gefunden.
    1. Entweder stimmt der Fenstertitel nicht, den Du bei FindWindow mitgegeben hast oder
    2. das Fenster ist noch nicht da, weil das Prog noch nicht komplett geöffnet wurde.

    Falls 1. nicht zutrifft, versuchs mal mit Sleep dazwischen:

    WinExec("k:\\\\...\\toll.exe",SW_SHOW);  
    Sleep(5000);
    HWND hHandle = ::FindWindow(NULL, "Toll"); //Der Fenstername steht oben in der Titelleiste
    

    5000 (5 sec) ist ziemlich lang, aber kannst Dich ja mit kleineren Werten runtertesten.
    (Bedenke aber, das manche Anwendung beim wirklich ersten Start, etwas länger brauch, als wenn sie das zweite mal aufgerufen wurde)



  • Hallo,

    jetzt sieht das so aus:

    WinExec("k:\\\\...\\toll.exe",SW_SHOW); 
    	Sleep(2500);
    	HWND hHandle = ::FindWindow(NULL, "toll"); //Der Fenstername steht oben in der Titelleiste 
    
    	CWnd* pCwnd = FromHandle(hHandle);  
    
    			if (pCwnd) 
    			{
    			pCwnd->SetForegroundWindow();
    			}
    			else
    			{
    			MessageBox("nix");
    			}
    

    jetzt zeigt das zu öffnede fenster unter den anderen fenster an und ohne das ich die fenster schliess komme ich nicht es ran und trotzdem zeigt er die messagebox, auch noch an....... 😞



  • Kann es sein das du deine erste Anwendung so definiert hast das diese immer im Fordergrund steht??? 😕



  • kann sein, aber nicht mit absicht,
    ich probiere schon die ganze zeit rum wie und wo man so etwas ändern kann,
    kannst du mir einen tipp geben??



  • In den Eigenschaften.



  • du meinst fenster markieren und über rechte maustaste ->eigenschaften oder wie
    weil so ändert das nicht viel...
    es sei den ich hab wieder mal alles verdreht....



  • Das kam mir in den Sinn.
    Wenn du willst kannst du mir den Code mal zusenden und ich schaue mir mal an wo der Fehler sein könnte.
    Ferndiagnosen sind immer schlecht 😃



  • So kannst mir nicht sagen wo ich die grösse des fensters verändern kann,
    vieleicht sollte ich die sdi anwendung immer in den vordergrund setzen.....
    wäre aber auch blöd weil die fenster im hintergrund noch weiter bearbeiten müsste



  • Wieso auf einmal die größe???
    Denn so wie ich das kapiere willst du aus dem Dialog eine SDI Anwendung starten und diese dann nach vorne setzten.
    Entweder du gehst in den Resourcen Editor deines Dialoges und rufst die Eigenschaften deines Dialoges auf um nach zu schaun ob du eventuell dein Dialog immer in den Vordergrund stellst, oder du Minimierst deinen Dialog mit:

    ::ShowWindow(this,SW_SHOWMINIMIZED);
    

    Dein Dialog ist dann noch da, aber die SDI ist vorne.

    MFG

    RS



  • Hallo,
    das mit der grösse war nicht gemeint, da war ich wohl noch ein wenig in gedanken... 😉

    aber was schreib ich vor ::ShowWindow(this,SW_SHOWMINIMIZED);
    und voralendingen wo setzte ich das hin??? 😕 😕



  • WinExec("k:\\\\...\\toll.exe",SW_SHOW);  
        Sleep(2500); 
        HWND hHandle = ::FindWindow(NULL, "toll"); //Der Fenstername steht oben in der Titelleiste  
    
        CWnd* pCwnd = FromHandle(hHandle);   
    
                if (pCwnd)  
                { 
                pCwnd->SetForegroundWindow(); 
                ::ShowWindow(this,SW_SHOWMINIMIZED);
                } 
                else 
                { 
                MessageBox("nix"); 
                }
    

    MFG

    RS



  • zeigt es mir folgenden fehler an:

    \Mat4x4Dlg.cpp(178) : error C2664: 'ShowWindow' : Konvertierung des Parameters 1 von 'class CMat4x4Dlg *const ' in 
    'struct HWND__ *' nicht moeglich
            Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert
     einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Fehler beim Ausführen von cl.exe.
    

    😞 😞 😕 😕



  • Schreibe mal folgendes rein:

    ::ShowWindow(SW_SHOWMINIMIZED);
    

    sollte auch gehen.



  • dann kommt das:

    ShowWindow' : Funktion akzeptiert keine 1 Parameter

    tue ich vorne statt this NULL reinschreiben zeigt es zwar keine fehler,
    öffnet aber nicht das programm...



  • Du musst ja noch das HWND mitgeben, oder wenn du in einem CWnd bist die Doppelpunkte weglassen. Ist es so schwer mal in der Doku zu lesen?



  • Dann setze es mal vor den SetActiveWindow...bla und füge als ersten wert GetActiveWindow(),... ein.

    MFG

    RS


Anmelden zum Antworten