Ну более подробно MSDN и книга Д.Рихтера "Windows - для проффессионалов" Вот пример я выдрал из своего проекта: AppDLL.h
| Код | /******************************************************************** Module : AppDll.h Subject : < ********************************************************************/
#ifndef DLLLOADAPI #define DLLLOADAPI extern "C" __declspec(dllimport) #endif #include <windows.h> //------------------------------------------------------------------- DLLLOADAPI LRESULT CALLBACK MouseProc(
int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates );
//-------------------------------------------------------------------
|
AppDll.cpp
| Код | /******************************************************************** Module : AppDll.cpp Subject : < ********************************************************************/
#define DLLLOADAPI extern "C" __declspec(dllexport) #include "AppDLL.h" UINT WM_RECTLEAVE; LRESULT CALLBACK MouseProc(
int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { MOUSEHOOKSTRUCT * mc= (MOUSEHOOKSTRUCT *) lParam; static HWND hwnd=0; if (hwnd != 0) { if (hwnd != mc->hwnd) // || (!PtInRect(&rect,mc->pt))) { PostMessage(hwnd,WM_RECTLEAVE,0,0); hwnd=mc->hwnd; } } else hwnd=mc->hwnd;
return CallNextHookEx(NULL,nCode,wParam,lParam); }
BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*) {
switch( reason ) { case DLL_PROCESS_ATTACH: WM_RECTLEAVE=RegisterWindowMessage("WM_RECTLEAVE"); // Initialize once for each new process. // Return FALSE to fail DLL load. break;
case DLL_THREAD_ATTACH: // Do thread-specific initialization. break;
case DLL_THREAD_DETACH: // Do thread-specific cleanup. break;
case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; } return TRUE; // Successful DLL_PROCESS_ATTACH. }
|
AppDll.def
| Код | LIBRARY AppDll
DESCRIPTION 'Aplication DLL'
EXPORTS MouseProc @1
|
Ну и сама иницилизация хука в теле программы
| Код | AppDll=LoadLibrary("AppDll.dll"); if (AppDll !=NULL) { typedef LRESULT (CALLBACK *TMouseProc)(int, WPARAM, LPARAM); hook = SetWindowsHookEx(WH_MOUSE, (TMouseProc) GetProcAddress(AppDll,"MouseProc"),AppDll,0); }
|
Ну и убийство онного
| Код | if (hook !=NULL) UnhookWindowsHookEx(hook); hook=NULL; if (AppDll !=NULL) FreeLibrary(AppDll);
|
|