Re[9]: Global Mouse Hook (опять)
От: spazhev_dima  
Дата: 28.02.07 12:47
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее). Список DLL, от которых зависит ваша DLL вы легко можете получить с помощью утилиты depends.exe из Platform SDK.


Проверил. Не зависит.
Переписал ее полностью на С, без использовании вообще чего-то Билдерововского.

Работать не стало

Немного измененный код: (C-style)

//---------------------------------------------------------------------------

#include <windows.h>

#pragma data_seg(".JOE")
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;
}
//---------------------------------------------------------------------------


extern __declspec(dllexport) LRESULT CALLBACK _stdcall MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMSG FirstParam = (LPMSG)wParam;

if(FirstParam->wParam == MK_LBUTTON)
{
LPMSG SecondParam = (LPMSG)lParam;
int x = SecondParam->pt.x;
int y = SecondParam->pt.y;

::MessageBox(0, "test", "OK", MB_OK);
}
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------

extern __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);
} else
{
switch(::GetLastError())
{
case ERROR_INVALID_HOOK_FILTER: ::MessageBox(0, "ERROR_INVALID_HOOK_FILTER", "OK", MB_OK); break;
case ERROR_HOOK_NEEDS_HMOD: ::MessageBox(0, "ERROR_HOOK_NEEDS_HMOD", "OK", MB_OK); break;
case ERROR_GLOBAL_ONLY_HOOK: ::MessageBox(0, "ERROR_GLOBAL_ONLY_HOOK", "OK", MB_OK); break;
case ERROR_INVALID_PARAMETER: ::MessageBox(0, "ERROR_INVALID_PARAMETER", "OK", MB_OK); break;
case ERROR_JOURNAL_HOOK_SET: ::MessageBox(0, "ERROR_JOURNAL_HOOK_SET", "OK", MB_OK); break;
default: ::MessageBox(0, "UNKNOWN error", "OK", MB_OK); break;
}
}

return 1;
}
//---------------------------------------------------------------------------


extern __declspec(dllexport) BOOL CALLBACK ClearMyHook(HWND AWnd)
{
int Result = ::UnhookWindowsHookEx(hHook);

if(Result) ::MessageBox(0, "Hook WAS deleted.", "OK", MB_OK);
else
{
LPVOID lpMsgBuf;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
::MessageBox(0, (char *)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
::LocalFree( lpMsgBuf );
}

return Result;
}
//---------------------------------------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.