C++ Builder Snippets  

Eine Windows-Anwendung beenden (EnumWindows-Beispiele):
 
//---------------------------------------------------------------------------
// Ein Anwendungbeispiel für die API-Funktion EnumWindows()
//---------------------------------------------------------------------------
// EnumWindows generiert eine Aufzählung aller Windows Desktop-Fenster.
// Sie erwartet eine Funktion als Argument - das Betriebssystem ruft
// diese Funktion für jedes gefundene Fenster einmal auf. 
//
// Folgendes Beispiel demonstriert die Anwendung der EnumWindows-Funktion:
//
// Benötigt werden: eine Listbox ListBox1 - für die Ausgabe der Fensterliste
//                  Button Button1        - zum Aktualisieren der Fensterliste
//                  Button Button2        - zum Beenden der Windows-Rechner
//                                          (falls aktiv :)
//                  --------------------------------------------------------
//                  (das Ganze plaziert auf dem Formular Form1)
// 
// - ein Klick auf den 1. Button füllt die Listbox mit der Aufstellung
//   der Titellesten-Texte aller aktiven desktop-Fenster.
//
// - der Eventhandler des 2. Buttons ruft die EnumWindows mit der
//   Callback-Funktion "KillAllCalcInstances" als Argument auf, die 
//   dafür sorgt, dass alle Fenster mit dem String "Rechner" in der 
//   Titelleiste geschlossen werden.
//
// Achtung : Eine Windows Callback-Funktion kann keine reguläre 
//           Member-Funktion einer C++-Klasse sein ! 
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Eventhandler für Klick auf den Button "Fensterliste aktualsieren"
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // Fensterliste aktualisieren:
  ListBox1 -> Clear();
  EnumWindows((WNDENUMPROC)ShowAllWindows, 0);
}

//---------------------------------------------------------------------------
// Beendet alle aktiven Windows-Rechner
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  // Alle Rechner-Instanzen beenden:
  EnumWindows((WNDENUMPROC)KillAllCalcInstances, 0);
}

//---------------------------------------------------------------------------
// Callback-Funktion schreibt Titelleisten-Texte aller gefundenen Non-Child-
// Fenster in die ListBox:
//---------------------------------------------------------------------------
BOOL CALLBACK ShowAllWindows(HWND hwnd,LPARAM lParam)
{
  char pcWinTitle[256]; // Für Fenster-Titel...

  // Falls kein Child-Fenster:
  if(!GetWindow(hwnd, GW_OWNER))
  {
    // Fenster-Title (Caption) auslesen:
    GetWindowText(hwnd, pcWinTitle, 255);

    // Falls Titel vorhanden in die Listbox einfügen:
    if(AnsiString(pcWinTitle).Trim() != EmptyStr)
      Form1 -> ListBox1 -> Items -> Add(pcWinTitle);
  }
  // true zurückgeben, um Aufzählung fortzusetzten:
  return TRUE;
}

//---------------------------------------------------------------------------
// Beenden aller Rechner-Instanzen:
//---------------------------------------------------------------------------
BOOL CALLBACK KillAllCalcInstances(HWND hwnd,LPARAM lParam)
{
  char pcWinTitle[256]; // Für Fenster-Titel...
  DWORD pid = 0// Für die Process-Id
  HANDLE hProcess; // Process-Handle

  // Falls kein Child-Fenster:
  if(!GetWindow(hwnd, GW_OWNER))
  {
    // Fenster-Title (Caption) auslesen:
    GetWindowText(hwnd, pcWinTitle, 255);

    // Falls Win-Rechner, Fenster schliessen:
    if(AnsiString(pcWinTitle) == "Rechner")
    {
      //-------------------------------------
      // und hier entweder höflich nachfragen, 
      // was das Programm vom Beenden hält:
      PostMessage(hwnd, WM_CLOSE, 0,0);
      //-------------------------------------
      // oder einfach Process beenden:
      
      // Process-Id besorgen:
      // GetWindowThreadProcessId(hwnd, &pid);
      // Process mit allen Zugriffsrechten öffnen:
      // hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
      // und tschüss...
      // TerminateProcess(hProcess, 0);
  }
  // true zurückgeben, um Aufzählung fortzusetzten:
  return TRUE;
}

  Download BCB4
Projekt-Quellcode
Download
Demo-Exe

© '99-2000 by S. Kreutzmann