Пытаюсь примерно так дллка Код (Text): #include "stdafx.h" #include <windows.h> extern "C" __declspec(dllexport)LRESULT CALLBACK CLHH(int nCode, WPARAM wParam, LPARAM lParam); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } LRESULT CALLBACK CLHH(int nCode,WPARAM wParam,LPARAM lParam) { MSG mm; memcpy(&mm,&wParam,sizeof(MSG)); if(mm.wParam==WM_CHAR) { MessageBox(0,(char*)mm.lParam,"",MB_OK); } ZeroMemory(&mm,sizeof(MSG)); return CallNextHookEx(NULL,nCode,wParam,lParam); } постановка хука Код (Text): #include "stdafx.h" #include <windows.h> #include <conio.h> int _tmain(int argc, _TCHAR* argv[]) { SetLastError(0); HINSTANCE hLib = LoadLibrary("HOOKdll.dll"); HOOKPROC pCLHH; pCLHH=reinterpret_cast<HOOKPROC>(GetProcAddress(hLib,"_CLHH@12")); HHOOK hHook=SetWindowsHookEx(WH_MSGFILTER,pCLHH,hLib,0); printf("%d",GetLastError()); getch(); UnhookWindowsHookEx(hHook); FreeLibrary(hLib); return 0; } Но так ничего не происходит ЗЫ GetLastError() конечно же 0 возвращяет.
Нашол у себя ляп "memcpy(&mm,&wParam,sizeof(MSG));" надо было lParam.Пробовал также и WH_GETMESSAGE ,неработает
_nic +WM_CHAR вроде как приходят через TranslateMessage а не через GetMessage/PeekMessage. Попробуйте отловить другие сообщения.
Используйте захват таблицы калбеков(apfnDispath/pfnClient). Здесь начинаются любые теложвижения шадова в юзермоде.
KeSqueer Какую оценку, о чём вы ? Я массив указателей перемещаю в другое место от User32.dll и там меняю ссылки на свои обработчики, тогда поток развёртывает шадова калбек и вызыват мой.
Обьясните тогда ламеру.Почему если я всетаки получаю HWND с помощью хуков,я немогу вклинится в их обработчики событий?Или что может быть такое окно HWND которого не получится получить через такой хук?
Код (Text): WH_KEYBOARD Windows вызывает этот хук когда функции GetMessage или PeekMessage собираются вернуть сообщения WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN, или WM_CHAR. Когда хук установлен как локальный, эти сообщения должны поступать из входной очереди потока, к которому прикреплен хук. Фильтрующая функция получает виртуальный код клавиши и состояние клавиатуры на момент вызова клавиатурного хука. Фильтры имеют возможность отменить сообщение. Фильтрующая функция, прикрепленная к этому хуку, должна знать о существовании следующих кодов: HC_ACTION Windows вызывает хук WH_KEYBOARD с этим кодом при удалении события из системной очереди. HC_NOREMOVE Windows вызывает хук WH_KEYBOARD с этим кодом, когда клавиатурное сообщение не удаляется из очереди, потому что приложение вызвало функцию PeekMessage с параметром PM_NOREMOVE. При вызове хука с этим кодом не гарантируется передача действительного состояние клавиатуры. Приложение должно знать о возможности возникновения подобной ситуации. Код (Text): WH_MSGFILTER Windows вызывает этот хук, когда диалоговое окно, информационное окно, полоса прокрутки или меню получают сообщение, либо когда пользователь нажимает комбинацию клавиш ALT+TAB (или ALT+ESC) при активном приложении, установившем этот хук. Данный хук устанавливается для конкретного потока, поэтому его безопасно размещать как в самом приложении, так и в DLL. Фильтрующая функция этого хука получает следующие коды: MSGF_DIALOGBOX: Сообщение предназначено либо диалоговому, либо информационному окну. MSGF_MENU: Сообщение предназначено меню. MSGF_SCROLLBAR: Сообщение предназначено полосе прокрутки. MSGF_NEXTWINDOW: Происходит переключение фокуса на следующее окно. В WINUSER.H определено больше MSGF_-кодов, но в настоящее время они не используются хуком WH_MSGFILTER. В lParam передается указатель на структуру, содержащую информацию о сообщении. Хуки WH_SYSMSGFILTER вызываются перед хуками WH_MSGFILTER. Если какая-нибудь из фильтрующих функций хука WH_SYSMSGFILTER возвратит TRUE, хуки WH_MSGFILTER не будут вызваны.