unit CloseApp; { By Duncan McNiven, duncan.mcniven@lecs.inet.fi } { Comments by Brad Stowers, bstowers@pobox.com } interface uses WinTypes; procedure CloseAppFromInst(HInst: THandle); implementation uses WinProcs, Messages; { Callback function that has each top-level window passed to it. } { Return true to continue enumerating, false to stop. } function EnumWindowsProc(Handle: HWND; Info: Pointer): boolean; {$IFDEF WIN32} stdcall; {$ELSE} export; {$ENDIF} begin Result := TRUE; { continue enumeration } { Does this app have the same instance as what we are looking for? } {$IFDEF WIN32} if GetWindowLong(Handle, GWL_HINSTANCE) = LongInt(Info) then begin {$ELSE} if GetWindowWord(Handle, GWW_HINSTANCE) = LongInt(Info) then begin {$ENDIF} PostMessage(Handle, WM_CLOSE, 0, 0); { Close the app } Result := FALSE; { stop enumerating windows, we are done. } end; end; procedure CloseAppFromInst(HInst: THandle); begin EnumWindows(@EnumWindowsProc, LongInt(HInst)); end; end.