Если что сильно меня не пинайте за тупые вопросы ибо в программировании я новичок. Вообщем, осваиаваю туториалы Iczeliona, правда пишу все это на C. У меня возник ступор на уроке 24 по хукам. Проблема в том, что диалоговая поцедура получает сообщение WM_MOUSEHOOK только один раз после установки хука, далее приложение никак не реагирует на манипуляции с мышью. Если же в конце обработчика сообщения WM_MOUSEHOOK снимать хук на действия мыши, а затем снова его ставить, то тогда все работает правильно, но, как я понимаю, такой подход к решению проблемы кривой: Код (Text): case WM_MOUSEHOOK: ......... UninstallHook(); InstallHook(hDlg); break; Предполагаю, что проблема связана с разделяемыми глобальными переменнымив Dll, так как эксперименты показали что приложению все равно помечаю ли я переменные разделяемыми или нет: Код (Text): #pragma data_seg("Shared") __declspec(allocate("Shared")) HWND hWnd; __declspec(allocate("Shared")) HHOOK hHook; #pragma data_seg() #pragma comment(linker, "/SECTION:Shared,RWS") Если у кого-нибудь есть соображения на счет причин такого поведения приложения, то поделитесь пожалуйста мыслями.
Причины просты Код обработки твой где находится? В процедуре ИнсталХук или самого обработчика? Где-то была статья по хукам от Bill Prisoner Замечательная кстати. Все куда более понятно чем у Икзелеона. Еще желательно код приведи свой. Зачем строить догадки, если при приведении кода можно указать на ошибку..? )))
Вот привожу свой код: Код (Text): #include <windows.h> BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); #define IDD_MAINDLG 101 #define IDC_CLASSNAME 1000 #define IDC_HANDLE 1001 #define IDC_WNDPROC 1002 #define IDC_HOOK 1003 #define IDC_EXIT 1005 #define WM_MOUSEHOOK WM_USER+1 bool HookFlag=FALSE; char LibName[]="MyDll"; char HookText[]="&Hook"; char UnhookText[]="&Unhook"; char templat[]="%1x"; FARPROC UninstallHook; HHOOK (*InstallHook)(HWND); HINSTANCE hLib; //--------------------------------------------------- int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR CmdLine, int CmdShow) { hLib=LoadLibrary(LibName); if (hLib==NULL) MessageBox(NULL, "DLL not found", "Dll", MB_OK); else{ UninstallHook=GetProcAddress(hLib, "UninstallHook"); if (UninstallHook==NULL) MessageBox(NULL, "Uninstall function not found", "Dll", MB_OK); InstallHook=(HHOOK(*)(HWND))GetProcAddress(hLib, "InstallHook"); if (InstallHook==NULL) MessageBox(NULL, "Install function not found", "Dll", MB_OK); } return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, DlgProc, NULL); } BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { static HINSTANCE hInst; char buffer[128]; char buffer1[128]; RECT rect; switch (uMsg) { case WM_CLOSE: if (HookFlag) UninstallHook(); EndDialog(hDlg, NULL); break; case WM_INITDIALOG: GetWindowRect(hDlg, &rect); SetWindowPos(hDlg, HWND_TOPMOST, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW); break; case WM_COMMAND: if (lParam!=0){ if (HIWORD(wParam)==BN_CLICKED){ if (LOWORD(wParam)==IDC_EXIT) SendMessage(hDlg, WM_CLOSE, 0, 0); else{ if (HookFlag==FALSE){ if (InstallHook(hDlg)!=NULL){ HookFlag=TRUE; SetDlgItemText(hDlg, IDC_HOOK, UnhookText); } } else { UninstallHook(); SetDlgItemText(hDlg, IDC_HOOK, HookText); HookFlag=FALSE; SetDlgItemText(hDlg, IDC_CLASSNAME, NULL); SetDlgItemText(hDlg, IDC_HANDLE, NULL); SetDlgItemText(hDlg, IDC_WNDPROC, NULL); } } } } break; case WM_MOUSEHOOK: //GetDlgItemText(hDlg, IDC_HANDLE, buffer1, 128); //wsprintf(buffer, templat, wParam); //if (lstrcmpi(buffer, buffer1)!=0) SetDlgItemText(hDlg, IDC_HANDLE, buffer); //SetDlgItemText(hDlg, IDC_HANDLE, buffer); //GetDlgItemText(hDlg, IDC_CLASSNAME, buffer1, 128); GetClassName((HWND)wParam, buffer, 128); //if (lstrcmpi(buffer, buffer1)!=0) SetDlgItemText(hDlg, IDC_CLASSNAME, buffer); SetDlgItemText(hDlg, IDC_CLASSNAME, buffer); break; default: return FALSE; } return TRUE; } // Dll_code---------------------------------------------------------------------------- #include <windows.h> extern "C" __declspec(dllexport) void Mouseproc(DWORD nCode, WPARAM wparam, LPARAM lparam); #define WM_MOUSEHOOK WM_USER+1 HINSTANCE hInstance=0; #pragma data_seg("Shared") __declspec(allocate("Shared")) HWND hWnd; __declspec(allocate("Shared")) HHOOK hHook; #pragma data_seg() #pragma comment(linker, "/SECTION:Shared,RWS") BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReservrd) { switch (dwReason) { case DLL_PROCESS_ATTACH: hInstance=hDll; break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) HHOOK InstallHook(HWND hwnd) { hWnd=hwnd; hHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)Mouseproc, hInstance, NULL); return hHook; } extern "C" __declspec(dllexport) void UninstallHook(void) { UnhookWindowsHookEx(hHook); return; } extern "C" __declspec(dllexport) void Mouseproc(DWORD nCode, WPARAM wparam, LPARAM lparam) { static MOUSEHOOKSTRUCT mousehookstr; static MOUSEHOOKSTRUCT *pMouse; CallNextHookEx(hHook, nCode, wparam, lparam); pMouse=(MOUSEHOOKSTRUCT *)lparam; mousehookstr=*pMouse; PostMessage(hWnd, WM_MOUSEHOOK, (WPARAM)WindowFromPoint(mousehookstr.pt), 0); return; }
Если имеется в виду код обработки сообщения WM_MOUSEHOOK, то он находится в диалоговой процедуре главного окна. Если же речь идет о функции-фильтре для ловушки, то она находится в Dll в отдельной процедуре, на которую дается указатель при установке хука на события мыши. Если я недопонял вопрос, то поправьте меня.
q_q А почему должно быть именно LRESULT? Опыт показал, что это никак не влияет на функционирование программы
q_q Да, твоя правда, а я просто тупил два дня. Оказывается причина в том, что функция-фильтр должна быть функцией обратного вызова, и это естественно ведь ее вызов осуществляет ОС, отсюда соответственно и возвращаемый параметр типа LRESULT. Спасибо твоя подсказка помогла