Maximale systemlast, wenn programm als Child läuft.



  • ums weng vorstellbarer zu machen flenders :

    ich hab nen progg für diablo II geschrieben, da das im window mode beim klick auf den desktop ständig minimiert und man dadurch keine kontrolle mehr über das game hat so lange bis mans wieder maximiert, da das ne nervige funktion ist und viele leute in der comm mega nervt hab ich halt ein progg gebaut, was das d2 window als parent übernimmt und im vordergrund hält, wenn man wo aufn desktop klickt.

    einfach aber wirkungsvoll und alle sind glücklich, ich würd nun aber gern dauerhaft so spielen, wenn da net sie hohe systemlast wäre. die wie gesagt nur dann ist, wenn ich in ein spiel gehe. so lange ich im chanel steh is die systemlast nahezu 0, egal ob ich das game als parent gegriffen habe oder obs allein läuft.

    wenn das game hingegen allein läuft hab ich auch net sone hohe systemlast wenn ich in nem game bin, das wiederum habe ich nur wenn ichs als parent am laufen habe. ich hoffe jetzt is die ganze sache weng klarer 🙂



  • Du kannst es ja mal mit einer anderen Anwendung als Diabolo 2 versuchen - z.B. Notepad. Ich vermute nämlich, dass das ganze an dem Spiel liegt (sonst müsste es ja auch vorher schon so hohe Systemlast erzeugen). Problem ist eben, dass die meisten Spiele als Vollbildanwendung ausgelegt sind, da sie dann mehr System-Ressourcen bekommen können. Bindest du es jetzt als Child ein, läuft das Spiel nicht mehr im Exklusiv-Modus und andere Anwendungen ziehen zusätzlich Prozessor-Leistung. Daher denke ich, dass sich das nicht wirklich lösen lässt - aber ich habe auch nicht so viel Ahnung, dass das heißt, dass es auf keinen Fall nicht geht.



  • naja flenders man kann diablo II per parameter von haus aus auch als window mode also im fenster starten, und da is die auslastung wie gesagt gegen null.



  • Startest du es dann auch so (also mit diesem Parameter), wenn du es bei dir als Child einbindest? Evtl. wird da dann Code-technisch auch eine andere Nachrichtenschleife vervendet?! 🙄



  • klar , ich starte es, ich muss es sogar so starten, mit parametern, das fenster ist nicht veränderbar in seiner größe, selbst wenn ich versuche aus dem window mode nen vollbild zu machen funzt das net. es maximiert zwar das fenster, aber man sieht trotzdem net mehr als nur die 800x600 aus dem window mode.

    schwer zu erklären ^^ alles in allem bin ich aber gezwungen es im window mode zu starten. das programm ist ja auch nur für den window mode geplant. d2 minimiert zwar auch im vollbild modus, wenn irgend etwas auf dem desktop aufpoppt( wie icq oder so) aber das ist nicht mein haupt augenmerk atm.

    mir gehts darum das ich das window von d2 im window mode oben , also OnTop halt. was auch funktioniert aber eben unter ner extrem hohen system last wenn ich in ein spiel gehe. für mich sieht es auch so aus als wenn d2 die ressourcen nur vorsorglich auf 100% setzt aber nicht so viel brauch, da ich nach wie vor mit den meiner meinung nach selben fps spiele als wenn ichs net mit meiner anwendung onTop halte. ich denke mal das programm brauch die ressourcen gar net.

    da ich noch nicht so weit fortgeschritten bin mit der windows programmierung kann ich leider nicht ganz nach vollziehen, was da genau passiert. denke mir aber das da irgend welche commands gesendet werden aber nicht abgefangen.

    ich hatte ja auch gehofft das konrad seine idee noch etwas ausführt 🙂

    danke und ein schönes wochenende CAD



  • Hm, dann weiß ich auch nicht so wirklich weiter - kannst ja mal mit Spy++ bzw. WinSpector nachschauen, ob du viele Messages gesendet bekommst, die du abfangen solltest?!

    Hast du mal versucht, das Programm gar nicht als Child einzubinden, sondern normal zu starten und dann die Window-Styles auf Always-On-Top zu korrigieren?



  • wenn ich dieses spy++ richtig verstanden habe ( ich nutze normal kein vc) dann zeigt das alle threads des programms an wenn man auf das + vor dem programm namen klickt. da wäre dann aber das prob das es vor Game.exe von Diablo II kein + gibt. oO

    // Edit

    ich hab schon alles mögliche probiert um das fenster onTop zu setzen, das game fesnter von d2 nimmt keine änderungen an. daher hab ich mir ja erst die arbeit gemacht dieses tool zu schreiben, sonst hätt mans ja einfachstens mit nem button baun können.



  • Ich habe das auch schon festgestellt.
    Bei mir ist das auch immer, wenn ich die Message-Funktion

    PeekMessage(...)
    

    anstatt

    GetMessage(...)
    

    verwende.

    Wenn ich also

    GetMessage(..)
    

    verwende, dann habe ich normale Systemauslastung.

    PeekMessage(...)
    

    hingegen wartet ja nicht auf eine Nachricht, sondern holt sich immer eine und wartet nicht.
    Vielleicht Hilft Dir das ja weiter...

    Wobei es mich mal interessieren würde, wie man bei PeekMessage() die Systemleitung runterschrauben kann?!?!
    D.h, dass der Computer nicht immer 100% Systemauslastung hat.

    Gruß
    DeineMutter



  • DeineMutter schrieb:

    Wobei es mich mal interessieren würde, wie man bei PeekMessage() die Systemleitung runterschrauben kann?!?!

    Indem du mit WaitMessage, Sleep o.ä. auf deine Rechenzeit verzichtest...



  • ich betnutze weder GerMessage noch PeekMessage, denke aber das es was bringen würde wild umherfliegende messages vom game window ab zufangen und gegebenen falles zu lenken bzw weiter zu leiten.

    würd GetMessage oder PeekMessage sowas erledigen?



  • MasterCAD schrieb:

    ich betnutze weder GerMessage noch PeekMessage...

    Das heißt, du hast bisher noch gar keine Message-Loop?! 😕

    Wie sieht denn dann deine Parent MessageProc aus? Und wie deine WinMain - wenn du angeblich gar kein GetMessage / PeekMessage verwendest?!



  • kann sein das ich euch auch falsch verstehe, ich hab halt keinen befehl eingebaut der so heist.

    oh ich sehs grad. in der winmain is nen getmessage, jo an die hab ich schon gar net mehr gedacht ^^ das is schon in fleisch und blut 😃 ja ok dann hab ich ne GetMessage() sry 😮

    bin schon vollkommen verwirrt wegen diesen blöden 100% ich zerbrech mir schon tage lang den kopf und nix ändert sich.

    sry



  • Zeig doch z.B. mal deine WndProc des Parent-Windows...



  • //------------------------------------------------------------------------------
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance     = hInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc   = WindowProcedure;      /* This function is called by windows */
        wincl.style         = CS_DBLCLKS;                 /* Catch double-clicks */
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon         = LoadIcon (hInstance, MAKEINTRESOURCE( IDI_MYICON));
        wincl.hIconSm       = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_MYICONSM));
        wincl.hCursor       = LoadCursor (hInstance, IDC_ARROW);
        wincl.lpszMenuName  = NULL;                 /* No menu */
        wincl.cbClsExtra    = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra    = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground =  (HBRUSH) COLOR_BACKGROUND;//CreateSolidBrush(RGB( 236, 233, 216));
                                // macht das fenster durchsichtig
                                //(HBRUSH) GetStockObject( RGB( 236, 233, 216));//COLOR_BACKGROUND;
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Syllis kleines Helferlein",       /* Title Text */
               DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               690,                 /* The programs width */
               430,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    

    das ?



  • Nein, deine WindowProcedure...



  • ich hab keine ahnung was da was ist flenders ich bring mir das alles step by step selber bei.... die callback funktion? da sind ~30 buttons definiert... das alles hier zu posten wäre weng überladen sag mir doch was genau dich da interessiert? die WM_PAINT ? oder bestimmte auszüge? oder kann man hier was anhängen?





  • jo k dann weis ich jetzt es net callback heist sondern windowproc. nun nochmal meine frage was genau willst du da haben flenders? oder kann ich die datei hier anhängen? ich hab noch keine ahnung wie ich ein windowproc über mehrere dateien verteile, da immer fehler kommen, ich hab mehrere subclasses drin , wo es mir sehr lieb wäre wenn ich die in ne extra datei schreiben könnte aber wie gesagt... keine ahnung wie ich das in WinApi mache.



  • MasterCAD schrieb:

    jo k dann weis ich jetzt es net callback heist sondern windowproc.

    Wie du es nennst ist eigentlich egal, ich hab einfach mal den Namen genommen der in deinem Code steht - aber den hast du offenbar nicht selber geschrieben...

    MasterCAD schrieb:

    nun nochmal meine frage was genau willst du da haben flenders?

    Den Code der Fensterprozedur, welches du als Parent für dein Spiele-Fenster verwendest.

    MasterCAD schrieb:

    ich hab noch keine ahnung wie ich ein windowproc über mehrere dateien verteile, da immer fehler kommen, ich hab mehrere subclasses drin , wo es mir sehr lieb wäre wenn ich die in ne extra datei schreiben könnte aber wie gesagt... keine ahnung wie ich das in WinApi mache.

    Das merkt man 🙄
    Wieso willst du eine Fensterprozedur über mehrer Dateien verteilen (abgesehen davon das das nicht geht)? Und wozu verwendest du Subclassing bzw. was meintest du mit subclasses 😕



  • unter subclassing versteh ich das subclassen von funktionen oder prozeduren...

    ich hab mir die gebaut damit ich mit tab von einem fenster ins nächste komme... keine ahnung was man sonst noch unter sublassing versteht... die windowsproc hab ich sehr wohl selber geschrieben.. wie sonst sollte ich mir ne anwendung baun die macht was _ich_ will.... ich kommentiere das wies im lehrbuch steht damit ich nachvollziehen kann was ich wo wie mache... wie gesagt lerne ich seit ner woche winapi und muss noch ab und zu nach sehen was ich wie gemacht habe.

    zu deinem code :

    da ich nach wie vor _nicht_ weis was genau ich dir posten soll poste ich dir die gesamte winproc hier rein ....

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static bool bStartet = 0, bIsChild = 0, bOnTop = 0;
        PAINTSTRUCT         ps;
        HDC                 hdc, hdcMem ;
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
            {
                hButtonStart = CreateWindow( "BUTTON",
                                             "Start",
                                             WS_CHILD | WS_VISIBLE,
                                             10,
                                             10,
                                             100,
                                             25,
                                             hwnd,
                                             NULL,
                                             ((LPCREATESTRUCT) lParam) -> hInstance,
                                             NULL);
    
                hEditDirs   = CreateWindow( "COMBOBOX",
                                            cHauptDir_,
                                            WS_CHILDWINDOW | WS_VISIBLE | CBS_DROPDOWN | CBS_SORT |  WS_VSCROLL | WS_EX_CONTROLPARENT,
                                            10,
                                            50,
                                            300,
                                            100,
                                            hwnd,
                                            NULL,
                                            (( LPCREATESTRUCT) lParam) ->hInstance,
                                            NULL);
    
                hCheckOnTop   = CreateWindow( "button",
                                            "On Top",
                                            WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                                            580,
                                            605,
                                            110,
                                            25,
                                            hwnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);
    
                SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
                ReadRegistry();
                LoadDirs();
    
                break;
            }
    
            case WM_COMMAND:
            {
                if (lParam == (LPARAM)hButtonStart)
                {
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        RECT rect;
                        GetWindowRect(hwnd, &rect);
                        char temp[20];
                        GetWindowText( hButtonStart, temp, sizeof( temp));
    
                        // Solange der Button auf warten steht keine eingabe zulassen !
                        if( !(strcmp( temp, "Warten !")))
                        {
                            break;
                        }
                        if( bStartet == 1)
                        {
                            SendMessage( hwnd, WM_DESTROY, 0, 0);
                            break;
                        }
    
                        // wenn fenster mit dem titel Diablo II nicht gefunden wurde
                        if( !( FindWindow( NULL, "Diablo II")) && ( bIsChild != 1))
                        {
                            // Diablo 2 öffnen
                            _beginthread( Thread1, 0, NULL);
    
                            // Timer setzen um nach öffnen den Focus auf D2 zu erhalten
                            SetWindowText( hButtonStart, "Warten !");
                            SetTimer( hwnd, 1, 15000, NULL);
                            break;
                        }
    
                        if( FindWindow( NULL, "Diablo II") && ( bIsChild != 1))
                        {
                            hChild = FindWindow( NULL, TEXT("Diablo II"));
                            bIsChild = 1;
                        }
                        SetForegroundWindow( hChild);
                        SetParent(hChild, hwnd);
                        iLaenge = 800;
                        iBreite = 670;
    
                        SetWindowPos( hwnd, NULL, rect.left, rect.top, iLaenge, iBreite,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
                        SetWindowPos( hChild, NULL, -5, -30, 800, 620, SW_SHOW);
    
                        Sleep( 2000);
                        SetWindowPos( hButtonStart, NULL, 150, 605, 30, 100, SW_SHOW);
                        SetWindowPos( hEditDirs, NULL, 260, 605, 30, 300, SW_SHOW);
                        SetWindowText( hButtonStart, TEXT( "Exit !"));
                        SetWindowText( hwnd, cWindowText);
    
                        ShowWindow(hChild,SW_SHOW);
                        UpdateWindow(hChild);
                        bStartet = 1;
                    }
                }
    
                if (lParam == (LPARAM)hCheckOnTop)
                {
                    RECT rect;
                    GetWindowRect(hwnd, &rect);
    
                    if (HIWORD(wParam) == BN_CLICKED)
                    {
                        if( bOnTop == 1)
                        {
                            SetWindowPos( hwnd, HWND_NOTOPMOST, rect.left, rect.top, iLaenge, iBreite, SWP_NOMOVE | SWP_NOSIZE |SWP_SHOWWINDOW);
                            bOnTop = 0;
                        }
                        else
                        {
                            SetWindowPos( hwnd, HWND_TOPMOST, rect.left, rect.top, iLaenge, iBreite, SWP_NOMOVE | SWP_NOSIZE |SWP_SHOWWINDOW);
                            bOnTop= 1;
                        }
                    }
                }
    
                break;
            }
            case WM_TIMER:
            {
    
                KillTimer( hwnd, 1);
                RECT rect;
                GetWindowRect(hwnd, &rect);
    
                Sleep( 1000);
    
                // Wenn D II gefunden und noch nicht als Child gesetzt dann nehmen
                if( FindWindow( NULL, TEXT( "Diablo II")) && ( bIsChild != 1))
                {
                    hChild = FindWindow( NULL, TEXT("Diablo II"));
                    SetWindowText( hwnd, cWindowText);
    
                    bIsChild = 1;
                }
                else if( !( FindWindow( NULL, TEXT( "Diablo II"))))
                {
                    MessageBox( NULL, "Diablo II konnte nicht geöffnet werden ! Richtigkeit des Pfades überprüfen !", "Fehler !", MB_OK);
                    SetWindowText( hButtonStart, "Start");
                    bIsChild = 0;
                    return -1;
                }
    
                // Game Fenster zeigen
                ShowWindow( hChild, SW_RESTORE);
    
                // Sicherheitshalber noch in den Vordergrund setzen lassen
                SetForegroundWindow( hChild);
    
                // Als parent übernehmen
                SetParent(hChild, hwnd);
    
                iLaenge = 800;
                iBreite = 670;
    
                // Hauptfenster vergrößern und TOPMOST setzen
                SetWindowPos( hwnd, HWND_NOTOPMOST, rect.left, rect.top, iLaenge, iBreite, SWP_SHOWWINDOW);
    
                // Game Fenster nehmen und einrücken, das die titelleiste nicht
                // mehr zu sehen ist
                SetWindowPos( hChild, NULL, -5, -30, 800, 620, SW_SHOW);
    
                Sleep( 2000);
                // StartButton auf Text Exit setzen
                SetWindowText( hButtonStart, TEXT( "Exit !"));
    
                // StartButton verschieben unter das Game Fenster
                SetWindowPos( hButtonStart, NULL, 150, 605, 30, 100, SW_SHOW);
    
                // Editfeld der Dirs verschieben unter das Game Fenster
                SetWindowPos( hEditDirs, NULL, 260, 605, 30, 300, SW_SHOW);
    
                ShowWindow(hChild,SW_SHOW);
                UpdateWindow(hChild);
                bStartet = 1;
    
                break;
            }
    
            case WM_SIZE:
            {
                RECT rect;
                GetWindowRect(hwnd, &rect);
                if( HIWORD(wParam) == SIZE_RESTORED)
                {
                    //MessageBox( NULL, "Wiederhergestellt !", "", MB_OK);
                }
    
                break;
            }
            case WM_MDIREFRESHMENU:
            {
                MessageBox( NULL, "Redraw !", "", MB_OK);
                break;
            }                    
            case WM_DESTROY:
            {
                DWORD pID = 0;
                void* hProc;
    
                GetWindowThreadProcessId(hChild, &pID);
                hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pID);
                CloseHandle(hProc);
    
                SendMessage ( hChild , WM_CLOSE, 0, 0);
    
                PostQuitMessage( 0);
                break;
            }
    
            case WM_PAINT:
            {
                hdc = BeginPaint( hwnd, &ps);
                EndPaint (hwnd, &ps) ;
    
                break;
            }
    
            case WM_ACTIVATE:
            {
                if (LOWORD(wParam) == WA_ACTIVE )
                {
                    SetForegroundWindow( hChild);
                }
                break;
            }
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    ich hoffe das ist jetzt hilfreicher.

    // edit ich seh grad das hier gar keine subclasses vorhanden sind, da das nen anderes programm ist, ne light version wenn man so will. das problem bestand aber schon bevor ich subclasses eingebaut hatte von daher kanns net daran liegen.


Anmelden zum Antworten