Programm innen 'hintergrund' schieben



  • hey ho,
    für mein programm, welches unter DOS laufen soll, muss ich n programm in den 'hintergrund' schieben. sprich:
    im vordergrund läuft anfangs n zähler, bei welchem man auch was eingeben kann, was durch n kleinen filter(zb.: ae in ä umschreiben usw) laufen soll und nach ner gewissen inaktivität soll dann n kleines Grafikprogramm in den vordergrung geholt werden, welches durch n tastendruck aber wieder beendet wird und der zähler wieder auf null gesetzt wird, .. leider übersteigt dies dann auch scho meine bisherigen kenntnisse.

    kurz: sone art Bildschirmschoner unter DOS.

    hoffe ihr habt verstanden was ich will und könnt mir da hilfen



  • Wie soll die Hilfestellung denn aussehen? Was hast du bisher gemacht und woran scheitert es?



  • es scheiter am nicht vorhandenem wissen darum, wie ich das Programm im Hintrgrund laufen lasse, und, bei bedarf, wieder innen vordergrund hole^^



  • Google ist dann in Zukunft dein bester Freund.

    ... 
    void ShowConsoleWindow (int cmd)
    {
    char str[MAX_PATH];
    GetConsoleTitle (str, MAX_PATH);
    ShowWindow (FindWindow (NULL, str), cmd);
    }
    
    ...
    ShowConsoleWindow (SW_HIDE); 
    ShowConsoleWindow (SW_SHOW);
    

    BTW: Das funktioniert in der Dos und Win32 Konsole. Denke, dass du nicht wirklich Dos gemeint hast.



  • Dohoch ^^ inner schule proggen wir unter DOS, und das program MUSS unter DOS laufen 😃 weil der lehrer es liebt dort zu programmieren 😉

    google war noch nie mein freund, liefiert zuviel ohne das was sinnvolles dabei is 😉

    danke schonma,
    aber wenne mir jezze noch genau erklären kannst, was wohin muss *ja, ja, der große nachteil googles ;)*

    bzw.
    wo kommen SW_hide und SW_show her ?^^



  • Hobbyfreak schrieb:

    Dohoch ^^ inner schule proggen wir unter DOS, und das program MUSS unter DOS laufen 😃 weil der lehrer es liebt dort zu programmieren 😉

    Nur um das klarzustellen: auf euren Schulcomputern ist das Betriebssystem Dos installiert?

    Hobbyfreak schrieb:

    google war noch nie mein freund, liefiert zuviel ohne das was sinnvolles dabei is 😉

    Hm, bei mir nicht.

    Hobbyfreak schrieb:

    aber wenne mir jezze noch genau erklären kannst, was wohin muss *ja, ja, der große nachteil googles ;)*

    Schau dir ein Tutorial an, oder lies in einem Buch nach.

    Hobbyfreak schrieb:

    wo kommen SW_hide und SW_show her ?^^

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/ShowWindow.asp
    Und diesen Link hat mir tatsächlich google geliefert. Man staune.

    [EDIT]
    Achja, den Link würde ich mir mal gut durchlesen, wenn du kapiert hast wo die Funktion stehen muss, und beim Kompilieren trotzdem Fehler auftreten.
    [/EDIT]



  • Hobbyfreak schrieb:

    [...]inner schule proggen wir unter DOS, und das program MUSS unter DOS laufen [...]

    Wenn's wirklich DOS (und nicht die "DOS Eingabeaufforderung" von 9x/Me bzw. der Kommandointerpreter "cmd.exe" von WinNT, 2000, XP, 2003) sein soll, dann hilft dir ShowWindow() nicht. Gibt's unter DOS natürlich nicht. Weiters ist dir doch bewusst, das DOS ein singletask OS ist!? Es gibt einen DOS-Interrupt, welcher dein Programm "resident" beendet - sprich es bleibt im Speicher und kann z.B. auf Interrupts reagieren:

    MOV  AH, 0x31  ; Funktionsnummer
        MOV  AL, ?     ; Return-Code
        MOV  DX, ?     ; zu reservierende Speichergröße (in Paragraphen)
        INT  0x21      ; Interrupt auslösen.
    

    Hobbyfreak schrieb:

    google war noch nie mein freund, liefiert zuviel ohne das was sinnvolles dabei is 😉

    Oh Gott, lass es Hirn regnen 😉
    Nein im ernst, freunde dich mit Google an!

    Hobbyfreak schrieb:

    wo kommen SW_hide und SW_show her?

    Du meinst SW_HIDE und SW_SHOW? Diese Konstanten sind in der <windows.h> definiert. Aber unter DOS -> Pustekuchen.



  • Hmmm ich glaube eher das er meint das die Befehlszeile verwendet wird bzw. diese uralt Turbo C Versionen und kein Dev.
    Hatten wir auch 2 Jahre lang, dass ist der größte Mist den es gibt aber ne Menge Lehrer wollen sich eben nicht umstelllen. Mehrer Tasks mit real DOS ne da geht doch nicht ;-P



  • Wenn's wirklich DOS (und nicht die "DOS Eingabeaufforderung" von 9x/Me bzw. der Kommandointerpreter "cmd.exe" von WinNT, 2000, XP, 2003) sein soll, dann hilft dir ShowWindow() nicht. Gibt's unter DOS natürlich nicht. Weiters ist dir doch bewusst, das DOS ein singletask OS ist!? Es gibt einen DOS-Interrupt, welcher dein Programm "resident" beendet - sprich es bleibt im Speicher und kann z.B. auf Interrupts reagieren

    na das isses doch, wovon der lehrer gefaselt hat 😃
    wie geht das ?^^



  • Du sagst Borland Turbo C?
    In diesem Falle könnte

    #include <dos.h>
    
    #define INTR 0x1C    /* The clock tick interrupt */
    #define ATTR 0x7900  /* Screen attribute (blue on grey) */
    
    #ifdef __cplusplus
    #    define __CPPARGS ...
    #else
    #    define __CPPARGS
    #endif
    
    /* reduce heaplength and stacklength to make a smaller program in memory */
    extern unsigned _heaplen = 1024;
    extern unsigned _stklen  = 512;
    
    void interrupt ( *oldhandler )( __CPPARGS );
    
    typedef unsigned int ( far *s_arrayptr );
    
    void interrupt handler( __CPPARGS )
    {
        s_arrayptr screen[80];
        static int count;
    
        screen[0] = (s_arrayptr) MK_FP(0xB800,0);
    
        count++;
        count %= 10;
    
        screen[0][79] = count + '0' + ATTR;
    
        oldhandler();  /* call the old interrupt handler */
    }
    
    int main(void)
    {
    
        oldhandler = _dos_getvect(INTR);  /* get the address of the current clock tick interrupt */
        _dos_setvect(INTR, handler);      /* install the new interrupt handler */
    
        /*  _psp is the starting address of the
         *  program in memory.  The top of the stack
         *  is the end of the program.  Using _SS and
         *  _SP together we can get the end of the
         *  stack.  You may want to allow a bit of
         *  saftey space to insure that enough room
         *  is being allocated ie:
         *  (_SS + ((_SP + safety space)/16) - _psp)
         */
    
        _dos_keep(0, (_SS + (_SP/16) - _psp));
        return 0;
    }
    

    eventuell helfen.

    HIH
    Greetz, Swordfish



  • @Hobbyfreak

    fänd ich geil, wenn euer lehrer wirklich dos macht. da kann man schön viel mit machen, viel mehr als mit diesem "blöden", langweiligen 'windows fenster grafik zeugs' 😉 aber ich glaub immernoch, du meinst die windows32 konsolen eingabe.. wegen dem "im hintergrund laufen"..

    @swordfish
    schönet programmstück..:) nachher mal testen

    edit: uff, so viele rechtsschreibfehler heute ...



  • Moin elise

    Compiliert unter Borland C++ v3.1. Sollte aber auch mit Borland Turbo C gehn

    elise schrieb:

    schönet programmstück..:) nachher mal testen

    für Dich doch immer 😉



  • geeignete compiler liegen zu hauf hier 😉
    und zwei dosmaschinen ebenso...
    😉



  • Ich liebe Dich!
    Ähm... wollt sagen, leute, die DOS-Boxes nebst vernünftigen Compiler griffbereit haben. *rofl*

    Greetz, Swordfish



  • moinsen,
    sorry das ich mich jezze erst wieder melde, hatte viel zutun die Woche..

    erstma Danke soweit, wäre aber nett, wenn mans mir nochma genauer erklären könnte das ganze, weil ich nixx verwenden will, was ich net verstehe...
    (musses ja wahrscheinlich dann noch erklären, weil ich der erste bin, ders macht 😉 )



  • Ich weiss nicht ob es dir hilft, aber ein ehemaliger Schulkamerad sollte auch einen Bildschirmschoner unter dos schreiben und das stichwort dafür war: TSR (Terminate and Stay Resident) http://de.wikipedia.org/wiki/TSR-Programme

    Das problem war halt, das es wirklich für dos sein sollte und dieses ist ja bekanntermaßen nicht wirklich multitasking fähig 😉
    Daher ist es nicht so einfach, ein Programm im Hintergrund laufen zu lassen, während man weiterhin mit/in dos arbeitet.

    Er musste sich halt in die 'TSR' technik reinarbeiten... Was er allerdings nicht geschafft hat... 🤡

    Leider habe ich im laufe der Zeit alles vergessen, was ich mir damals angeeignet habe (wollte ihm ein bisschen helfen) aber google sollte bestimmt irgendwas hilfreiches ausspucken...

    ndT Lupo

    *Ein Computer ist ein elektronisches Wunderwerk, das in einer zehntausendstel Sekunde die verwickeltsten Rechen- und Buchungsoperationen ausführt
    - und dann die Kontoauszüge mit zehn Tagen Verspätung verschickt.
    *
    anonym



  • Lupo4u2 schrieb:

    Ich weiss nicht ob es dir hilft, aber ein ehemaliger Schulkamerad sollte auch einen Bildschirmschoner unter dos schreiben und das stichwort dafür war: TSR

    Bingo, du hast es erfasst. Genau das macht mein Beispiel ein paar Posts weiter oben. Um das ganze jedoch verständlich zu erklären ist's mir auch schon zu lange her. Ich empfehle Google bzw. eine gute DOS Referenz.

    Greetz, Swordfish



  • habe das bsp gemacht für :

    void ShowConsoleWindow( int cmd )
    {
        char str[ MAX_PATH ];
        if( GetConsoleTitle( str, MAX_PATH ) )
        {
            fprintf( logFile, "ShowConsoleWindow:> str: %s, cmd: %d\n", str, cmd );
            ShowWindow( FindWindow ( NULL, str ), cmd );
        }
        else
            fprintf( logFile, "ShowConsoleWindow:> faild\n" );
    }
    

    und ich bekomme ihmmer ein faild bzw der str ist leer. ich habe ein cmd.exe programm und will das fenster verschwinden lassen, hier bekomm ich ihmmer ein faild. was mache ich falsch?



  • @tuxlein: Was hat dein Problem mit diesem Thread zu tun? Bitte eine Frage pro Thread und ein Thread pro Frage!

    Greetz, Swordfish



  • da es um das doch um das selbe geht, console, die in den hintergrund gelegt werden soll bzw unsichtbar gemacht werden soll aber gut wenn du meinst.



  • In diesem Thread ging es darum, Programme unter DOS (nicht in der "Windows Eingabeaufforderung" oder ähnlichem) in den hintergrund zu bringen!

    Versuch bei deinem Code mal FreeConsole() um die Console loszuwerden und AllocConsole() um eine neue zu bekommen.

    Greetz, Swordfish


Anmelden zum Antworten