самый простой способ:  procedure TRun.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
 begin 
 CanClose := false; 
 end; 
 если форма написана на вин апи то: 
 function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL; 
 begin 
 case msg of 
 WM_Destroy: 
 begin 
 PostQuitMessage (0); 
 Result := 0; 
 Exit; 
 end; 
 WM_CLOSE : 
 exit; 
 else 
 Result := DefWindowProc(wnd,msg,wparam,lparam); 
 end; 
 end; 
 или как вариант можно хуками, только емеет свои проблемы 
 //hHook:cardinal; 
 function SysMsgProc(code:integer;Wparam:word;Lparam:longint):longint;stdcall; 
 begin 
 //f8 - 115 
 //alt - 18 
 if (GetKeyState(18)<0) and (Wparam = 115) then 
 begin 
 MessageBoxA(0,'Nezya','Nezya',0); 
 end else 
 result:=CallNextHookEx(hHook,Code,Wparam,LParam); 
 end; 
 procedure TRun.Button1Click(Sender: TObject); 
 begin 
 hHook:=SetWindowsHookEx(WH_KEYBOARD,@SysMsgProc,HInstance,0); 
 end; 
 procedure TRun.Button2Click(Sender: TObject); 
 begin 
 UnhookWindowsHookEx(hHook); 
 end; 
 кстати этот код еще и является примером вызова глобального хука без длл-ки (только если закрывать другую прогу с помощью ALT-F4 тогда хук снимается)