(Borland C++...) Laufendes Programm beenden



  • Da solltest Du Dir mal die Funktion EnumWindows() ansehen. Die ist genauer als FindWindow() bzw. sie findet auch Anwendungen, die ihr Fenster nicht anzeigen (=z. B. Prozesse im TaskManager).

    In der dazugehörigen EnumWindowsProc() hast Du dann ein HWND auf ein Fenster, Du brauchst nun nur noch abprüfen, ob es sich um das gewünschte Programm handelt und es schließen.

    Ich überprüfe meist auf den Namen der EXE inkl. Programmpfad.
    Hab mir hier eine Funktion geschrieben, der ich einen HWND und einen Zeiger auf einen String, der dann den Pfad ink. EXE beinhaltet.

    Achtung, diese Funktion funktioniert in dieser Form nur unter NT-basierenden Betriebssystemen (WinNT, Win2000, WinXP).

    #include <Psapi.h>
    #pragma comment(lib, "psapi.lib") //...oder psapi.lib dem Projekt hinzufügen in der IDE
    
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
        DWORD lpdwProcessId; 
        HANDLE hProcessHandle;
    
        GetWindowThreadProcessId(hWnd, &lpdwProcessId); 
        hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
        GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
        CloseHandle(hProcessHandle);
    }
    

    Aufrufen tust Du die Funktion in der EnumWindowsProc(), die ja einen HWND zum bearbeiten von EnumWindows() bekommen hat...
    Dann vergleichst Du den Pfad des HWND mit dem Pfad des Programmes, das Du beendet willst (z. B. "C:\Programme\Winamp\Winamp.exe") und sobald die beide gleich sind RUMMS... WM_CLOSE... und Ruhe ist.

    Wie gesagt, funzt in der Version nur unter NT/2K/XP.

    Allerdings sehe ich auch keinen Grund, WebFritzis Funktion NICHT zu benutzen.... ich bin mir sicher sie funktioniert, und was großartig anderes hab ich hier auch nicht gezeigt... wirst Du auch "kleiner" nicht hinkriegen!

    [ Dieser Beitrag wurde am 20.06.2003 um 07:49 Uhr von Hepi editiert. ]



  • Jenachdem, was du machen willst, sind diese 2 Links auch noch ganz interessant:
    - Process Walking
    - Taking a Snapshot and Viewing Processes



  • Ich hab mich jetzt mit den beiden Enum Funktionen audeinandergesetzt komm jedoch mit den Parametern nicht ganz klar (MSDN hat mir natürlich nicht geholfen). Vielleicht würde ein kurzes Beispiel helfen? (Übrigens; den Code von Hepi hab ich wenigstens verstanden (und find ihn nicht schlecht))

    Das mit dem Snapshot hab ich auch schon probiert jedoch macht mir da mein Compiler Schwierigkeiten weil er GetProcessModule(...) nicht kennt.

    Langsam wird das zu einer unendlichen Geschichte.



  • Puh... na denn wollen wir mal.....

    #include <Psapi.h> // Wichtig für GetPathFromHandle!!!
    #pragma comment(lib, "psapi.lib") //...oder psapi.lib dem Projekt hinzufügen in der IDE
    
    // Funktionsdefinitionen:
    ...
    BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam);
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle);
    ...
    
    // Irgendwo in Deinem Programm kommt nun folgender Aufruf,
    // in diesem Fall mal bei einer WM_TIMER Message:
    
    ...
    case WM_TIMER:
        EnumWindows(EnumProc, NULL);
        return 0;
    ...
    
    // Dazu gehört, wie im ersten Parameter angegeben, eine EnumProc:
    
    BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) 
    {
        //
        // Jetzt haben wir ein HWND irgendeines Fensters
        // Also holen wir uns den Pfad zur zugehörigen EXE
        //
        char Buffer[MAX_PATH];
        char szPfadMitExe[]="c:\Windows\NotePad.exe"; 
        ZeroMemory(Buffer, sizeof(Buffer)); // Buffer leer machen...
        GetPathFromHandle(hwnd, Buffer);
        if (_stricmp(Buffer, szPfadMitExe)==NULL) 
        {
            //
            // _stricmp vergleich 2 strings miteinander
            // wobei es GROSS- und kleinschreibung
            // komplett ignoriert!
            // Oha, es MUSS notepad.exe sein!
            // Also beenden wir es mal...
            //
            SendMessage(hwnd, WM_CLOSE, NULL, NULL); 
            return FALSE; // FALSE = EnumWindows kann aufhören
        }
        else return TRUE; // TRUE = weitermachen, Notepad ja noch nicht drangewesen!
    }
    
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
        //
        // benötigt psapi.lib und psapi.h!!!
        // läuft nur unter NT-basierenden Windows
        // Also WinNT, Win2000, WinXP!
        //
        DWORD lpdwProcessId; 
        HANDLE hProcessHandle;
    
        GetWindowThreadProcessId(hWnd, &lpdwProcessId); 
        hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
        GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
        CloseHandle(hProcessHandle);
    }
    

    Jetzt initialisierst Du bei WM_CREATE den Timer (meinetwegen auf alle 5 Sekunden) und fragst in Deiner Nachrichtenschleife diese WM_TIMER ab...
    Alle 5 Sekunden werden nun ALLE Fenster nacheinander abgefragt und ihr HWND an die EnumProc gegeben!
    Die EnumProc schaut nun, ob unser Kandidat (notepad.exe) zum HWND gehört, und wenn ja, dann schließt es den Delinquenten!

    Probiers mal aus, starte Dein Programm (mit den Codeschnipseln von mir) und versuch mal, Notepad sinnvoll zu betreiben.... es wird Dir nicht wirklich gelingen...

    Bedenke bitte, das dies Beispiel oben nicht alleine compiliert werden kann! Es fehlt der komplette Windows-Unterbau! Du mußt es wenn in ein vorbereitetes Windows-Programm einbauen!

    [ Dieser Beitrag wurde am 21.06.2003 um 22:37 Uhr von Hepi editiert. ]



  • Nun hab ich ein kleines Compiler Problem. Da ich C++Builder6 von Borland verwende musst ich deinen Code leicht verändern. Ist mir auch gelungen. Doch nun gibt es zwei probleme;

    1. Code; case WM_TIMER:
    EnumWindows(EnumProc, NULL);
    return 0;
    Problem; Undefined Symbol 'EnumProc'

    2. Code; BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
    {....

    Problem; Improper use of typedef 'BOOL'.

    Wenn du keine Möglichkeiten weist diese Probleme zu beheben, muss ich mich halt an das bb Forum wenden.

    dein verzweifelter

    Gen.d.Pz.Tr.Seb.

    [ Dieser Beitrag wurde am 21.06.2003 um 22:49 Uhr von Gen.d.Pz.Tr.Seb editiert. ]



  • Original erstellt von Gen.d.Pz.Tr.Seb:
    Problem; Undefined Symbol 'EnumProc'

    Hast Du auch einen Funktionsprototypen angegeben (so wie ich oben im Code)?

    Original erstellt von Gen.d.Pz.Tr.Seb:
    Problem; Improper use of typedef 'BOOL'.

    Damit kann ich nun gar nichts anfangen.... ich denke mal der Funktionsprototyp fehlt...

    Ich benutze MS Visual C++ .NET 2002... kann Dir mit Borland nicht so weiterhelfen....



  • Ich habs wirklich vergessen!!!

    Aber es hat sich nur eine Fehlermeldung geändert;
    statt Undefined Symbol 'EnumProc' kommt jetzt
    Cannot convert 'int(___stdstdcall *)(void long)' to 'int (___stdcall *()

    Der Fehler mit Bool bleibt gleich.



  • EnumWindows() benötigt die User32.lib. Die hast Du eingebunden, ja?

    Wie gesagt, ich hatte damit noch nie ein Problem...



  • Unable to open include file ...



  • Eine .lib wird nicht per #include eingebunden!

    Ich beginne extreme Mängel bei Dir im Umgang mit Deiner Entwicklungsumgebung festzustellen!

    Du solltest mal ein paar Anleitungen, HowTo's, ReadMe's, Tutorials oder so lesen...

    [ Dieser Beitrag wurde am 21.06.2003 um 23:13 Uhr von Hepi editiert. ]



  • Ich weis auch das ich sehr schlecht bin. Zumindest mit der winapi. Außerdem hab ich ehrlich gesagt noch nie mit libs gearbeitet. Bei borland läuft alles über include.

    P.S.: Ich finde deine Umschreibung meiner Dummheit sehr, naja,.. literarisch perfekt.

    [ Dieser Beitrag wurde am 21.06.2003 um 23:17 Uhr von Gen.d.Pz.Tr.Seb editiert. ]



  • sooo lib includiert. nächster fehler; unable to open file...



  • Soo, wieder etwas verbessert. Jetzt gibt es nur mehr einen Fehler;

    Code; if (_stricmp(Buffer, szPfadMitExe)==NULL)
    {

    Problem; Call to undefined function '_stricmp' //ist schon behoben.

    Nächstes;

    Code; GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);

    Problem; call to undefined function, die lib läst sich nicht öffnen! Wie öffne ich libs (bei mir läst sich irgendwie keine öffnen)

    [ Dieser Beitrag wurde am 22.06.2003 um 10:42 Uhr von Gen.d.Pz.Tr.Seb editiert. ]

    [ Dieser Beitrag wurde am 22.06.2003 um 10:45 Uhr von Gen.d.Pz.Tr.Seb editiert. ]



  • Original erstellt von Gen.d.Pz.Tr.Seb:
    **Problem; call to undefined function, die lib läst sich nicht öffnen! Wie öffne ich libs (bei mir läst sich irgendwie keine öffnen)
    **

    Das fragste lieber im Borland C++ Builder (VCL/CLX)-Forum...


Anmelden zum Antworten