Чем Hook отличается от подмены WindowProc?
Чем предпочтительней пользоваться и почему?
SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId)
Ловушка(hook) устанавливается в поток с идентификатором ThreadId и позволяет при определенном событии(например при получении окном сообщения WH_GETMESSAGE) выполнить процедуру lpfn находящейся в библиотеке hMod.
А подмена оконной процедуры - SetWindowLongPtr(..) - позволяет обрабатывать сообщения окна "неродной" оконной процедурой. Но есть одна проблема. Она заключается в том, что обращение к процедуре другого процесса невозможно, т.к. каждый процесс владеет своим "личным" адресным пространством.
Ловушки могут использоваться, чтобы решить эту проблему.
Объяснил, как мог :) Но лучше почитать об этом у Рихтера
http://wm-help.net/books-online/book/59464/59464-16.html