Значит ситуация такая, ставлю хук (пока на блокнот). Хук работает нормально, все прекрасно, все замечательно, но как только завершаеться приложения в контексте которой был поставлен хук, то он магическим образом снимаеться, при этом dll остаеться в памяти. Сейчас покажу на коде Код (Text): extern "C" __declspec(dllexport) void SetHook() { DWORD t=0; HHOOK y=0; HWND wh=FindWindow(0,L"Безымянный - Блокнот"); t = GetWindowThreadProcessId(wh,NULL); if(t) y=SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, Module, t); if(!y) error(0,"SetWindowsHookEx"); SendMessage( wh, WM_NULL, 0, 0); } Это экспортируемая функция, собсно которую и надо вызывать чтобы поставить хук. Код (Text): LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { mes(0,"CallBack","nCode"); return (int)CallNextHookEx(0, nCode, wParam, lParam); } Обработка сообщений, идет как надо, пока создавшиее хук приложение работает. Для тех кто хочет спросить почему 0 в первом пораметре CallNextHookEx, превиду цитату из мсдн Windows NT/XP/2003: Ignored. Код (Text): HMODULE t= LoadLibrary(L"Spa.dll"); SetHook=(vfunk)GetProcAddress(t,"SetHook"); SetHook(); MessageBox(0,L"Sleep",L"Sleep",0); Это код приложения (ЕХЕ) которое ставит хук. Собсна после того кок мы нажимает Ок на мессаджбокс, все хук таинствено останавливаеться, и наша процедура обработки больше не получает управление
Когда приложение закрывается - освобождаются все ресурсы, выделенные процессом: объекты ядра, библиотеки итд. Также все хуки анхучиваются. Представь, если бы твоя прога понаставила бы кучу хуков, а потом грохнулась, и при этом все хуки бы остались?
bendme Ну вообщето хотелось бы чтобы да все хуки остались. ВЫход то я давно предумал, можно ставить хук, контексте нового процесса создавать еще 1 а тот убивать, но это какойто черезпопный метод. Есть еще варианты? Вообще хочу заметить что библиотека в памяти блокнота осталась... так что о каком сохранении ресурса идет речь )) add Пожалуй сразу скажу что предлагать всякие разные варианты инжекта длл не стоит. Хуки понятно дела не единственный способ, просто я не думал что хуки тоже анхучаться ((
> Вообще хочу заметить что библиотека в памяти блокнота осталась... так что о каком сохранении ресурса идет речь )) А у меня библиотека успешно выгружается из памяти. Только что проверял. Правда, я пользуюсь неявной загрузкой dll.
Код (Text): case DLL_PROCESS_ATTACH: Module = hModule; if(hh) { UnhookWindowsHookEx(hh); hh=0; if(!SetWindowsHookEx(WH_GETMESSAGE, CallMsgProc, hModule, t)) error(0,"SetWindowsHookEx"); SendMessage( wh, WM_NULL, 0, 0); } break; Сдесь вы можете наблюдать как я ставлю 1 хук и убираю другой. Все нормально работает. ХОчу обратить ваше внимание что теперь я ставлю WH_GETMESSAGE хочу профильтровать некоторые сообщения. Но чтоже полчаю в итоге. Код (Text): 0x00000118 WM_NCLBUTTONDOWN WM_LBUTTONUP WM_QUIT Те явно приходят не все сообщения. К примеру я хочу перед закрытием блокнота выдать какоето сообщения, но не могу WM_QUIT , приходит уже когда пора закрывать приложение.
SetWindowsHookEx(WH_GETMESSAGE... ставит хук на очередь сообщений, а через неё идут далеко не все сообщения - многие передаются прямым вызовом оконной функции, кстати даже SetWindowsHookEx(WH_CALLWNDPROC... не всегда достаточно
Y_Mur WH_CALLWNDPROC Мне бы хватило, но как не дать закрыться программе, я ведь не могу не пропустить собщения.
В смысле? Ловишь сообщение WM_CLOSE хуком -> выполняешь то, что тебе надо -> потом вызываешь Callnexthook. Если WM_CLOSE у тебя не ловится- тогда подмени функцию wndproc с помощью setwindowlong и уже там лови WM_CLOSE.
И программа закрываеться. Ну понятно что я могу и не вернуть, но как я понял отфильтровывать сообщения можно только WH_GETMESSAGE. Ну да ладно ща проверю
Одтверждаю свою догадку. Приложение хакрываеться. Так нарисовалась проблемма я не могу юзать SetWindowLong так придожении с которым я работаю, создает массу окон, а WM_CLOSE присылаеться тоолько активному окну, а оно может создаваться и динамически. Конечно у меня как всегда есть черезпопный метод, но хотелось бы услышать ваши предложения.
SetClassLong(... GCL_WNDPROC... Replaces the address of the window procedure associated with the class.
Y_Mur Ан не то, я рано обрадовался. Там проблемма в том что у каждого окна своя функция обработки!!, как следствие этот способ не катит. Я пока решил так делать, ловить активацию окна ставить на активное окно новый обработчик, как меняеться опять, тот снимать новый ставить. Способ как говориться не ахти, но в голову нечего не лезит получше ((