FindWindow // EnumWindows

  • hallo sitz hier vor eineme programm, das i in vs c++ (mfc) geschriebm hab.
    das programm ruft eine, bereits bestehende, consolenapplikation auf.

    der aufruf erfolgt mittels CreateProcess mit dem creationflag:
    CREATE_NO_WINDOW

    diese consolenanwendung terminiert allerdings erst, wenn der user eine taste drückt am ende, was logischerweise net geht, wenn kein fenster angezeigt wird.

    also will ich mir den windowhandle der consolenanwendung holen und solange ein SendMessage mit WM_KEYDOWN da hin schicken, bis die anwendung terminiert.

    das problem is, das FindWindow sowie auch EnumWindows nicht zu funktionieren scheinen, das diese anwendung ja ohne fenster läuft.
    weiß von euch vllt irgendwer, wie ich dieses problem lösen könnte??

    MfG

  • Wenn du nicht auf das ergebnis des sub-programmes wartest, kannst es sicher im hintergrund irgendwie starten, damit CreateProcess nicht blockt, beim beenden des hauptprogrammes _sollte_ dann das sub-programm eh automatisch beendet werden. KEYDOWN zu senden ist sicherlich keine gute idee. Wenn dann wuerd ich da noch eher die process-id von CreateProcess speichern, und nach X sekunden ein KillProcess (oder so aehnlich) machen.

  • und genau das is das problem. schaut im mom so aus, dass ich den exitcode des subprogs abfragen muss, um evtl fehlermeldungen ausgeben zu können.
    d.h. das prog läuft in einer schleife, in der auch die behandlung von messages passiert, solang das subprog nicht terminiert ist.

    Laut msdn bzw. auch einigen beiträgen, die ich gegoogelt hab, sollte FindWindow jedoch auch "unsichtbare" fenster abfragen können. was es auch mehr oder weniger oft macht, aber halt nicht jedes mal und ich hab keine ahung warum net :( *heul*
    und den prozess selbst "killen" kann ich auch net, weil die laufzeit von dem subprog net immer gleich is, kann schnell gehn aber auch ziemlch lange dauern, je nachdem welche daten es verarbeiten muss. :(

  • Sicher eine der aufwändigsten Lösungen,
    funkt aber sicher (erwiesenermaßen):

    In memory-patch-away the wait-for-key loop ...

    Eine Möglichkeit das zu bewerkstelligen:
    Die Konsolenapp. via win32-debug-api als Debugee starten.
    (IMHO die einfachste Möglichkeit, schreibenden Zugriff auf
    fremde Adressräume zu bekommen).
    Das process loaded but not yet started (oder so ähnlich) Event abfangen,
    nach der key-loop suchen, so modifizieren daß sie nie ausgeführt wird,
    Prozess danach starten.
    Voila, es gibt keine Abfrage mehr ...


    Trading for a living [equities,futures,forex]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!