Global Mouse Hook (опять)
От: spazhev_dima  
Дата: 21.02.07 14:58
Оценка:
Добрый день!

// Вопрос поднимся уже, и не раз.
// Я прочитал весь форум внимательно, все статьи и посты на эту темы, 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);
}
//---------------------------------------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.