Первый способ используется в 3-ем примере к приведенной выше статье.
Смотри строку
Код:
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
Здесь первый параметр это дескриптор главного окна твоей основной программы (куда посылается сообщение), его передают в dll при установке хука.
Второй параметр идентификатор сообщения, его получаем вот так
Код:
WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');
Здесь строку 'WM_MYKEYHOOK' замени на какую-нибудь свою и она должна быть одинаковой в основной программе и в dll.
Третий и четвертый параметр числа типа DWORD, здесь можешь указать какие-то свои произвольные данные.
Ловля этого сообщения в основной программе осуществляется в перегруженном обработчике WndProc, смотри тот же пример.
Второй способ состоит в том, что при вызове процедуры по установке ловушки ты можешь передать в dll дополнительный параметр - адрес процедуры. Она будет находиться в основной программе, но вызывать ее будет ловушка, находящаяся в dll.
Имхо первый способ всеже проще, тем более, что у тебя готовый пример под рукой.