Maximale systemlast, wenn programm als Child läuft.



  • 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.



  • Hast du mal mit Spy++ / Winspector geschaut, ob dein Haupfenster recht viele Nachrichten bekommt?



  • hmm habs jetzt mal mit spy++ gemacht, da ich aus dem tool aber net schlau werd, hab ich mal nen screen gemacht ^^

    http://mitglied.lycos.de/mastercad/Spy++Screen.JPG

    aber wie ichs auf den ersten blick sehen kann ist da nix ungewöhnliches erkenne. ich hoffe der screenschot is hilfreich



  • Dann oben auf das 5. Symbol von links gehen, mit dem Suchwerkzeug dein Hauptfenster auswählen und dann dir die Nachrichten anzeigen lassen...



  • nettes tool 🙂 wieder was gelernt danke ^^ is ja richtig interessant was da alles an is und reagiert 😃

    hmm wenn ich mich innerhalb meiner app befinde rasselt da ne ganz schöne liste an messages runter, wenn ich aber im game selber bin kommt nur noch KillFocus() und gut is. die systemlast is unabhängig davon immer hoch, egal ob ich mich in meiner app befinde oder im game selber. wenn ich im game bin rasselt da auch nur ne endlose messageliste wenn ich mich, oder eher die maus bewege. auch da bleibt die systemlast unabhänig hoch, egal ob ich was mache oder das fenster nur so da steht.



  • Was für Messages kommen denn noch beim Parent an, wenn der Fokus auf dem Spiel ist und du dich dort ganz normal durchs Spiel bewegst?



  • nix. absolut nix flenders.

    meine app selber hat auch keine systemlast. die ist vom start bis zum ende bei 0%. maximal 2%



  • Dann weiß ich nun leider auch nicht mehr weiter, denn dann scheint das Spiel sich offenbar daran zu stören, als Child zu laufen - und ob man da dann etwas machen kann...



  • das is nen 10 jahre altes spiel . keine ahnung aber ich glaub net das die da wirklich schon richtig sauberen code gebaut haben mit dem teil 🙂 bugs gibt es nach 10 jahren noch ohne ende.

    ich vermute auch das es mit dem child zu tun hat und danke dir trotzdem für deine geduldige hilfe flenders.

    ich dachte ja jochen schreibt nochmal was aber da kam leider auch nix mehr . keine ahnung ob er meint ich schreib nen hack oder irgend nen anderes thirdparty progg. isses aber net. wirds auch nie.

    nochmals vielen dank flenders und cYa CAD


Anmelden zum Antworten