Добрый день!
// Вопрос поднимся уже, и не раз.
// Я прочитал весь форум внимательно, все статьи и посты на эту темы, MSDN тоже,
// потратил два дня на это, поэтому писать снова не стыдно
Вопрос: я хочу поставить глобальный Mouse Hook.
Что я делаю неверно?
Возможно, наводящим вопросом будет:
Хук устанавливается, но не работает.
При попытке его освободить, говорит "Неверный дескриптор обработчика"
(Это при анализе GetLastError())
Исходный код:
//---------------------------------------------------------------------------
// DLL-Ка
//---------------------------------------------------------------------------
#include <clx.h>
#include <windows.h>
#pragma data_seg(".DIMA")
HWND hWnd = NULL;
#pragma data_seg()
HHOOK hHook;
HINSTANCE hInstance;
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hInstance = hinstDLL;
return 1;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMSG FirstParam = (LPMSG)wParam;
; // processing message
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) BOOL CALLBACK SetMyHook(HWND AWnd)
{
hWnd = AWnd;
hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC) MouseHookProc, (HINSTANCE)hInstance, NULL);
if(hHook != NULL)
{
MessageBox(0, "Hook was SET.", "OK", MB_OK);
}
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) BOOL CALLBACK ClearMyHook(HWND AWnd)
{
bool Result = UnhookWindowsHookEx(hHook);
if(Result) MessageBox(0, "Hook WAS deleted.", "OK", MB_OK);
return Result;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Проект
//---------------------------------------------------------------------------
// Types
typedef BOOL (CALLBACK *TSetMyHook)(HWND);
typedef BOOL (CALLBACK *TClearMyHook)(HWND);
//---------------------------------------------------------------------------
// В public-секции описания формы
TSetMyHook SetMyHook;
TClearMyHook ClearMyHook;
HINSTANCE hDllInstance;
//---------------------------------------------------------------------------
void __fastcall TCalendarMain::FormCreate(TObject *Sender)
{
AnsiString FName = ExtractFilePath(Application->ExeName) + "prjHookDLL\\prjHookDllMain.dll";
hDllInstance = LoadLibrary(FName.c_str());
if(!hDllInstance)
{
ShowMessage("Unable to load DLL ("+FName+")");
return;
}
SetMyHook = (TSetMyHook) GetProcAddress(hDllInstance, "SetMyHook");
if(!SetMyHook) ShowMessage("Unable to load procedure 'SetMyHook'");
ClearMyHook = (TClearMyHook) GetProcAddress(hDllInstance, "ClearMyHook");
if(!ClearMyHook) ShowMessage("Unable to load procedure 'ClearMyHook'");
if(!SetMyHook || !ClearMyHook)
{
FreeLibrary(hDllInstance);
return;
}
SetMyHook(this->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TCalendarMain::FormClose(TObject *Sender,
TCloseAction &Action)
{
if(ClearMyHook) ClearMyHook(this->Handle);
FreeLibrary(hDllInstance);
}
//---------------------------------------------------------------------------