Здравствуйте, lexer_lx, Вы писали:
_>MS VC++ 6.0 MFC Dialog Based App
_>Нужно поставить хуки глобальной области видимости, т.е., реализованные в dll.
_>Они должны отсылать главному окну приложения сообщения при нажатии на клавижи или движении мышью.
_>Хэлпов по этой теме достаточно, но, тем не менее у меня ничего не работает.
_>Вот код dll:
_>_>#define WM_RETURNIDLE (WM_USER + 155)
_>HWND NSWindow;
_>HHOOK KeyboardHook,MouseHook;
_>BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
_> {
_> HMODULE ThisDll;
_> switch (ul_reason_for_call)
_> {
_> case DLL_PROCESS_ATTACH:NSWindow=FindWindow(NULL,"Program");
_> ThisDll=GetModuleHandle(NULL);
_> KeyboardHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardHookProc,ThisDll,NULL);
_> MouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,ThisDll,NULL);
_> break;
_> case DLL_PROCESS_DETACH:if (KeyboardHook) UnhookWindowsHookEx(KeyboardHook);
_> if (MouseHook) UnhookWindowsHookEx(MouseHook);
_> }
_> return true;
_> }
_>exported LRESULT CALLBACK KeyboardHookProc(int iCode,WPARAM wParam,LPARAM lParam)
_> {
_> if (iCode>=0) {
_> if (NSWindow) PostMessage(NSWindow,WM_RETURNIDLE,0,0);
_> }
_> return CallNextHookEx(KeyboardHook,iCode,wParam,lParam);
_> }
_>exported LRESULT CALLBACK MouseHookProc(int iCode,WPARAM wParam,LPARAM lParam)
_> {
_> if (iCode>=0) {
_> if (NSWindow) PostMessage(NSWindow,WM_RETURNIDLE,0,0);
_> }
_> return CallNextHookEx(MouseHook,iCode,wParam,lParam);
_> }
_>
_>Код приложения:
_>_>BOOL CDlg::OnInitDialog() {
_> HMODULE hHookDll = LoadLibrary("nslib.dll");
_>}
_>LRESULT CDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
_> if (message == WM_RETURNIDLE) {
_> .........
_> }
_>}
_>
_>При запуске приложения есть реакция на нажатия клавиш, от мыши ничего не приходит.
_>Если убрать фокус с окна приложения, то и от клавы ничего не приходит.
_>И если потом вернуть его, то тоже не приходит ничего.
_>В чем моя ошибка ?
_>И плз, не отсылайет меня в хелпам =)
_>Благодарен за любые советы, кроме отсылания к хелпам )
Oshibka v tom chito pri DLL_PROCESS_ATTACH ty pytaeshisea naiti okno tvoego prilojeniya, kotoraya eschio ne suschestvuet (DLL-ki zagrujaiutsya do vhoda v functsiu Main/WinMain prolojeniya).
Moi sovet: sdelati escio 2 exportiruemye functsii (InstallHooks i UninstallHooks) i v OnInitDialog vizivaeshi InstallHooks a v OnDestroy/OnNcDestroy — vyzyvaeshi UninstallHooks.
P.S. Ya dumaya chito ponyatno chito vpisati v eti 2 functsii...
i conechino ubiraeshi vse iz DLL_PROCESS_ATTACH i DLL_PROCESS_DETACH
I eschio, KeyboardHookProc i MoseHookProc mojno ne exportirovati. oni "vneshemu miru" ne interesny