вот пример ожидание появления процесс в памяти но не с помощью хука а запуская процедуру ожидания процесса в отдельном потоке
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;