вот пример ожидание появления процесс в памяти но не с помощью хука а запуская процедуру ожидания процесса в отдельном потоке  
Code
 
 unit Unit1; 
 interface 
 uses 
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
   Dialogs, StdCtrls,tlhelp32; 
 type 
   TForm1 = class(TForm) 
     Button1: TButton; 
     Memo1: TMemo; 
     procedure Button1Click(Sender: TObject); 
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end; 
 var 
   Form1: TForm1; 
   ProcessName:String; 
 implementation 
 {$R *.dfm} 
 Procedure ChekProcess; 
 var 
 SnapShot:THandle; 
 process:TProcessEntry32; 
 begin 
   while true do 
   begin 
     SnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);//делаем снимок процессов 
     process.dwSize := SizeOf(Process);//указываем размер структуры 
     Process32First(SnapShot,Process);//начинаем перебирать процессы 
     repeat 
       if process.szExeFile = ProcessName then 
       begin 
         MessageBox(0,'Process Found','Process Found',0); 
         Exit;//выходим из потока 
       end; 
     until Process32Next(SnapShot,Process) <> true; 
     CloseHandle(SnapShot); 
   end; 
 end; 
 procedure TForm1.Button1Click(Sender: TObject); 
 var 
 thr,id:Cardinal; 
 begin 
 ProcessName := 'calc.exe';//указываем в глобальную переменную имя нужного нам процесса 
 thr := BeginThread(nil,0,Addr(ChekProcess),nil,0,id);//запускаем процедуру ожидания процесса в отдельном потоке 
 end; 
 end. 
 
   для того чтобы в функции хука проверять имя процесса который выполнил обработку события можно яюзать функцию ParamStr(0); 
 
Code
 
 function SysMsgProcn(code:integer;Wparam:word;Lparam:longint):longint;stdcall; 
 var 
 f:cardinal; 
 buf:array [0..255] of char; 
 buf2:string; 
 s:string; 
 i:integer; 
 nw:cardinal; 
 begin 
 result := CallNextHookEx(Syshook,code,wparam,lparam); 
 s := ParamStr(0); 
 for i := length(s) downto 1 do 
 begin 
 if s[i] = '\' then//немножечко парсим строку (отрезаем путь от имени ехе файла) 
 break; 
 end; 
 buf2 := Copy(s,i,Length(s) - i + 1); 
 if buf2 = 'calc.exe' then 
 MessageBoxA(0,'Process Found','Process Found',0); 
 end;