Laufende Anwendungen auslesen (Offene Fenster auslesen)



  • Hallo Community,

    ich habe hier im Forum so einiges zum Thema Windows Prozesse auslesen
    gefunden. Aber mich würde es interessieren ob es auch möglich wäre
    nur die Programme und Fenster aus zu lesen die gerade offen sind.

    Wäre eine große Hilfe wenn mir einer auch konkrete Links angeben könnte.

    Liebe Grüße!



  • Hallo

    Hier ein kleines Beispiel um die Fenster auszulesen.

    Stichwort: EnumWindows

    Die CPP-Datei

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	//Liest alle Fenster aus.
    	//Wichtig: Es werden nur TOP-Level Fenster aufgelistet
    	EnumWindows((WNDENUMPROC)bcGetWindows, 0);
    }
    //---------------------------------------------------------------------------
    
    BOOL CALLBACK bcGetWindows(HWND hwnd,LPARAM lParam)
    {
    	char cFenstername[1024]={'\0'};
    
    	//Ermittelt den Fensternamen.
    	GetWindowText(hwnd,cFenstername,1023);
    
    	//Ausgabe des Fensternamens
    	ShowMessage(AnsiString(cFenstername)); 
    
    	return TRUE;
    }
    

    Und hier die Headerdatei:

    #ifndef codeH
    #define codeH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    
    #include <map>
    //---------------------------------------------------------------------------
    
    BOOL CALLBACK bcGetWindows(HWND, LPARAM);
    
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-verwaltete Komponenten
    	TButton *Button1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Benutzer Deklarationen
    public:		// Benutzer Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Hoffe, konnte dir helfen.
    Meines wissens wurde das ganze auch schon hier im Forum besprochen. Einfach mal Suchfunktion oder die Help des Builders benutzen.



  • Hi Deforation,

    dein Beispiel Code ist auf jedenfall schonmal sehr interessant.
    Jedoch Listes der Code nicht nur aktive Fenster auf sondern zeigt auch
    die Anwendungen an die z.B. minimiert in der kleinen Icon Leiste rechts
    unten im Startmenü angezeigt werden.

    Außerdem werden alle unter Fenster einer Anwendung angezeigt und jede Menge
    komischen Müll der etwa so aussieht: "öö=))km/(" etc.

    Kannst du das bitte erläutern.

    Gruß!



  • vll hilft dir das noch weiter:
    http://www.marquardtnet.info/cecke/quickies.1/1_quicky_34.html
    Das HWND kannst du ja auf seine Eigenschaften hin überprüfen. (Hauptfenster, etc)

    greetz KN4CK3R



  • Mit Hilfe des Handles, kannst du alles über das Fenster erfahren, was du wills. Da dies ja der eindeutige Identifikator ist.

    So kannst du beispielsweise die Sichtbarkeit prüfen:
    BOOL IsWindowVisible(HWND hWnd);

    Oder ob es sich überhaupt um ein Fenster handelt:
    BOOL IsWindow(HWND hWnd);

    Allenfalls könntest du auch den Klassennamen prüfen:
    int GetClassName(HWND hWnd,LPTSTR lpClassName,int nMaxCount);

    Denn es kann auch sein, dass Gewisse Handles -> Objekte keine Bezeichnung haben aber einen Klassennamen. Darum könntest du auch noch folgendes prüfen. Ob überhaupt eine Bezeichnung existiert.

    if (cFenstername[0]!='\0') {
      //Fenster IO
    }
    else{
      //Fenster nicht IO
    }
    

    Vielleicht ist dies erläutert genut 😃



  • Hi Deforation,

    interessant. Finde ich nicht schlecht das man sich diese Informationen
    "liefern" lassen kann.

    Jedoch muss ich gestehen das ich nicht weiß wie ich damit
    korrekt umgehen kann, sprich: Wie kann ich den Wert der
    zurück geliefert wird speichern und auswerten?

    BOOL IsWindow(HWND hWnd);
    

    Das kenne ich garnicht.
    Und den Rückgabewert so zu speichern und aus zu werten ist nicht möglich:

    bool Window;
    Window = BOOL IsWindow(HWND hWnd);
    
    if(Window == true){ ... }
    

    Wie werten man diese Rückgabewerte aus?

    Gruß!



  • Das ganze ist eigentlich so aufgebaut:

    Wenn du das ganze hier nun auseinander nimmst. Bekommst du folgende Informationen:

    BOOL IsWindow(HWND hWnd);

    • BOOL: Der Rückgabewert der Funktion IsWindow();
    • IsWindow: Name der Funktion
    • HWND hWnd: Benötigter Parameter -> In diesemfall ein HWND was eigentlich für Handle steht.

    Nun hasst du 2 Möglichkeiten das zu prüfen:

    BOOL CALLBACK bcGetWindows(HWND hwnd,LPARAM lParam)
    {
        char cFenstername[1024]={'\0'};
        bool bisWindow;
    
        //Ermittelt den Fensternamen.
        GetWindowText(hwnd,cFenstername,1023);
    
        //Der Fenstername wird nur Ausgegeben, wenn das Fenster Sichtbar ist.
    
        //Variante 1: ------------
        if (IsWindow(hwnd))
          ShowMessage(AnsiString(cFenstername)); 
    
        //Variante 2: ------------
        bisWindow=IsWindow(hwnd);
        if (bisWindow)
          ShowMessage(AnsiString(cFenstername)); 
    
        return TRUE;
    }
    

    Das gute ist ja, dass wir durch die CALLBACK-Funktion das Handle (HWND) bereits haben. So kannst du dies gleich verwenden.



  • Hallo Deforation,

    vielen Dank für deine Erläuterung.
    Jetzt habe ich es verstanden und kann es auch anwenden.

    Finde das super interessant und denke werde mich mit dem Thema
    weiter beschäftigen.

    Gruß!


Anmelden zum Antworten