Installing and Releasing Hook Procedures
You can install a hook procedure by calling the
SetWindowsHookEx function and specifying the type of hook calling the procedure, whether the
procedure should be associated with all threads or with a particular thread, and
a pointer to a procedure entry point.
You must place a global hook procedure in a DLL separate from the application
installing the hook procedure. The installing application must have the handle
of the DLL module before it can install the hook procedure. The
LoadLibrary function, when given the name of the DLL, returns the handle of the DLL
module. After you have the handle, you can call the
GetProcAddress function to retrieve the address of the hook procedure. Finally, you use
SetWindowsHookEx to install the hook procedure address in the appropriate hook chain.
SetWindowsHookEx passes the module handle, a pointer to the hook-procedure entry point, and 0
for the thread identifier, indicating that the hook procedure should be
associated with all threads in the system. This sequence is shown in the following
example.
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;
hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,
hkprcSysMsg, hinstDLL, 0);
You can release a thread-specific hook procedure (remove its address from the
hook chain) by calling the
UnhookWindowsHookEx function, specifying the handle of the hook procedure to release. Release a
hook procedure as soon as your application no longer needs it.
You can release a global hook procedure by using
UnhookWindowsHookEx, but this function does not free the DLL containing the hook procedure. This
is because global hook procedures are called in the process context of every
application in the system, causing an implicit call to the
LoadLibrary function for all of those processes. Because a call to the
FreeLibrary function cannot be made for another process, there is then no way to free the
DLL. Windows eventually frees the DLL after all processes explicitly linked to
the DLL have either terminated or called
FreeLibrary and all processes that called the hook procedure have resumed processing
outside the DLL.
An alternative method for installing a global hook procedure is to provide an
installation function in the DLL, along with the hook procedure. With this
method, the installing application does not need the handle of the DLL module. By
linking with the DLL, the application gains access to the installation function.
The installation function can supply the DLL module handle and other details
in the call to
SetWindowsHookEx. The DLL can also contain a function that releases the global hook procedure;
the application can call this hook-releasing function when terminating.
- Software for developers
-
Delphi Components
.Net Components
Software for Android Developers
- More information resources
-
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
- Databases for Amazon shops developers
-
Amazon Categories Database
Browse Nodes Database