Festplattenbelegung und CPU Auslastung



  • Hallo,

    Ich suche Funktionen, um herauszufinden, welche Laufwerke ein Rechner besitzt und wie groß und wie voll die Laufwerke sind.
    Weiterhin benötige ich eine Information, wie stark die CPU zur Zeit ausgelastet ist, ähnlich wie im TaskManager.

    Gibt es dafür Funktionen in der WinAPI und sofern ja, wie heißen sie?

    Vielen Dank



  • Hast du schonmal die ein oder andere Suchmaschine bemüht? Ich bin mir sehr sicher, dass dazu etwas zu finden ist...
    Aber damit das nicht einer von diesen Suche-Doch-Selber-Posts wird, hier ein kleiner Quelltext, was der macht findest du schon raus 😃

    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    const UINT ID_LISTBOX = 1;
    
    static HWND hwndListBox;
    static char g_szClassName[] = "MyWindowClass";
    static HINSTANCE g_hInst = NULL;
    
    UINT limit = 20; //Notwendiger freier Speicherplatz in MB
    
    BOOL LaufwerkIsTrue[30];
    DWORD LaufwerkFreierSpeicher[30];
    short LaufWerkListBoxIndex[30];
    void GetLaufwerkInfo();
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
        int x;
        char str[256];
        unsigned short index;
    
        switch (Message)
        {
            case WM_CREATE:
                for (x = 0; x < 30; x++)
                {
                    LaufWerkListBoxIndex[x] = 1000;
                }
    
                hwndListBox = CreateWindowEx (WS_EX_CLIENTEDGE, "listbox", "", WS_CHILD | WS_VISIBLE | LBS_STANDARD, 10, 10, 200, 400, hwnd, (HMENU) ID_LISTBOX, g_hInst, NULL);
            return 0;
    
            case WM_COMMAND:
                switch (LOWORD (wParam))
                {
                    case ID_LISTBOX:
                        if (HIWORD (wParam) == LBN_SELCHANGE)
                        {
                            index = SendMessage (hwndListBox, LB_GETCURSEL, 0, 0);
                            for (int i = 0; i < 26; i++)
                            {
                                if (LaufWerkListBoxIndex[i] == index)
                                {
                                    sprintf (str, "Index %d Freier Speicher (MB) %d", index, LaufwerkFreierSpeicher[i]);
                                    MessageBox (hwnd, str, "", MB_OK | MB_ICONINFORMATION);
                                }
                            }
                        }
                    break;
                }
            return 0;
    
            case WM_CLOSE:
                DestroyWindow (hwnd);
            return 0;
    
            case WM_DESTROY:
                PostQuitMessage (0);
            return 0;
        }
    
        return DefWindowProc (hwnd, Message, wParam, lParam);
    }
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        if (FindWindow ("MyWindowClass", "HardDisk")) //verhindert, dass das Programm mehrfach gestartet wird
        {
            PostQuitMessage(0);
            return 0;
        }
    
        WNDCLASSEX WndClass;
        HWND hwnd;
        MSG msg;
        g_hInst = hInstance;
    
        WndClass.cbSize = sizeof (WNDCLASSEX);
        WndClass.style = CS_VREDRAW | CS_HREDRAW;
        WndClass.lpfnWndProc = WndProc;
        WndClass.cbClsExtra = 0;
        WndClass.cbWndExtra = 0;
        WndClass.hInstance = g_hInst;
        WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
        WndClass.hbrBackground = (HBRUSH)(LTGRAY_BRUSH);
        WndClass.lpszMenuName = NULL;
        WndClass.lpszClassName = g_szClassName;
        WndClass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        RegisterClassEx (&WndClass);
    
        hwnd = CreateWindowEx (WS_EX_TOOLWINDOW, g_szClassName, "HardDisk", WS_SYSMENU | WS_CAPTION, 100, 100, 400, 500, NULL, NULL, g_hInst, NULL);
    
        GetLaufwerkInfo ();
    
        ShowWindow (hwnd, nCmdShow);
        UpdateWindow (hwnd);
    
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
        return msg.wParam;
    }
    
    void GetLaufwerkInfo()
    {
        ULARGE_INTEGER FreeBytes;
        ULARGE_INTEGER TotalBytes;
    
        int ListBoxIndex = -1;
        int Drive = 1; // Laufwerktyp (1-6)
    
        char str[] =" "; // für A: bis Z:
    
        for (int zaehler = 0; zaehler < 26; zaehler++)
        {
            switch(zaehler)
            {
                case 0: strcpy (str, "A:"); break;
                case 1: strcpy (str, "B:"); break;
                case 2: strcpy (str, "C:"); break;
                case 3: strcpy (str, "D:"); break;
                case 4: strcpy (str, "E:"); break;
                case 5: strcpy (str, "F:"); break;
                case 6: strcpy (str, "G:"); break;
                case 7: strcpy (str, "H:"); break;
                case 8: strcpy (str, "I:"); break;
                case 9: strcpy (str, "J:"); break;
                case 10: strcpy (str, "K:"); break;
                case 11: strcpy (str, "L:"); break;
                case 12: strcpy (str, "M:"); break;
                case 13: strcpy (str, "N:"); break;
                case 14: strcpy (str, "O:"); break;
                case 15: strcpy (str, "P:"); break;
                case 16: strcpy (str, "Q:"); break;
                case 17: strcpy (str, "R:"); break;
                case 18: strcpy (str, "S:"); break;
                case 19: strcpy (str, "T:"); break;
                case 20: strcpy (str, "U:"); break;
                case 21: strcpy (str, "V:"); break;
                case 22: strcpy (str, "W:"); break;
                case 23: strcpy (str, "X:"); break;
                case 24: strcpy (str, "Y:"); break;
                case 25: strcpy (str, "Z:"); break;
            }
    
            Drive = GetDriveType (str);
            if (Drive == 3) //3 entspricht Festplatte
            {
                GetDiskFreeSpaceEx (str, &FreeBytes, &TotalBytes, NULL);
                if (FreeBytes.QuadPart / (1024 * 1024) >= limit)
                {
                    LaufwerkIsTrue[zaehler] = TRUE;
                    LaufwerkFreierSpeicher[zaehler] = (UINT) (FreeBytes.QuadPart / (1024 * 1024));
                }
                if (LaufwerkIsTrue[zaehler])
                {
                    char ausgabe[20];
                    sprintf (ausgabe,"%s %uMB", str, LaufwerkFreierSpeicher[zaehler]);
                    SendMessage (hwndListBox, LB_ADDSTRING, 0, (LPARAM) ausgabe);
    
                    ListBoxIndex++;
    
                    LaufWerkListBoxIndex[zaehler] = ListBoxIndex;
                    SendMessage (hwndListBox, LB_SETCURSEL, (WPARAM) 0, 0);
                }
            }
        }
    }
    


  • Schlechter Code.



  • wie wärs mal mit konstruktiver kritik, weil diese 2 wörter helfen nicht beim verbessern



  • 1. Die for-Schleife kann doch in einer Zeile den LW-Buchstaben erzeugen... und braucht kein "switch" dazu!
    2. "if (Drive == 3) //3 entspricht Festplatte" => Vordefinierte Konstanten verwenden (siehe Doku zu "GetDriveType")
    3. Die for-Schleife könntest Du auch ganz anders lösen indem Du "GetLogicalDriveStrings" aufrufst!
    4. Nicht TCHAR-Conform, lässt aich also nicht mit Unicode übersetzen (was seit 2005 default ist)



  • BitWax schrieb:

    Hast du schonmal die ein oder andere Suchmaschine bemüht? Ich bin mir sehr sicher, dass dazu etwas zu finden ist...

    Ich auch. Der Punkt ist eher umgekehrter Natur. Es gibt zuviel zu finden.
    Und da das eine Frage ist, die ein WinAPI fähigerer Mensch als ich es bin vermutlich im Schlaf beantwortet, und ich den Kram für Java brauche, weil diese super Sprache das leider in der zu benutzenden Version 1.5 nicht auf die Reihe bringt und ich mich dafür schon totgesucht habe, dachte ich, dass ich diesmal direkt eine Frage stelle.

    BitWax schrieb:

    Aber damit das nicht einer von diesen Suche-Doch-Selber-Posts wird, hier ein kleiner Quelltext, was der macht findest du schon raus 😃

    Vielen Dank!

    meinung_ schrieb:

    Schlechter Code.

    Mag sein, aber ob schlecht oder nicht, er hilft wenigstens bei der Fragestellung. Wo hilft Dein Kommentar, die Frage zu beantworten?

    Jochen Kalmbach schrieb:

    3. Die for-Schleife könntest Du auch ganz anders lösen indem Du "GetLogicalDriveStrings" aufrufst!

    Guter Hinweis 🙂

    PS: Weiß noch jemand etwas zur aktuellen CPU-Auslastung?


Log in to reply