[ gmail_ @ 24.03.2006. 12:21 ] @
porzdrav svima, prica ide otprilike ovako: radio sam program koji bi trebao biti nesto tipa Spy++, znaci ukratko: -trazenje prozora -pregled informacija o prozoru - i najvaznije presretanje poruka drugih prozora i sve je manje vise ok, osim zadnjeg djela(presretanje poruka) u zadnjem slucaju program radi 95% tocno a u ovih 5% skrsi explorer.exe. posto vec 2 mjeseca pokusavam sam skuzit di je problem bas i nejde pa evo da pitam nekog ko mozda nesto zna vise o tome. znaci imam dll koji subklasira prozor cije poruke zelim presretati i koji je zaduzen samo za poruke, i exe koji radi sve ostalo. kao sto rekoh program radi u 95% slucajeva ok, jedino kad zelim vidjeti poruke od recimo explorera, desktopa(mislim na SyslistView) i nesto vezano uz explorer mi se skrsi sa porukom da se desilo s***** u comctl32.dll-u kod od dll-a ide od prilike ovako: malo sam ga skratio zbog citljivosti. Code: /**moja nova wind proc*/ LRESULT CALLBACK MyNewWindowProc(HWND hw, UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg){ case WM_LBUTTONDOWN :{SendMessage(g_me,WM_MY_LBDOWN,wParam,lParam);break;} case WM_LBUTTONUP :{SendMessage(g_me,WM_MY_LBUP,wParam,lParam);break;} case WM_RBUTTONDOWN :{SendMessage(g_me,WM_MY_RBDOWN,wParam,lParam);break;} case WM_RBUTTONUP :{SendMessage(g_me,WM_MY_RBUP,wParam,lParam);break;} case WM_WINDOWPOSCHANGED :{SendMessage(g_me,WM_MY_PCHANGED,wParam,lParam);break;} case WM_WINDOWPOSCHANGING :{SendMessage(g_me,WM_MY_PCHANGING,wParam,lParam);break;} case WM_MOUSEHOVER :{SendMessage(g_me,WM_MY_MOUSEOVER,wParam,lParam);break;} case WM_MOUSEMOVE :{SendMessage(g_me,WM_MY_MOUSEMOVE,wParam,lParam);break;} case WM_MOUSEACTIVATE :{SendMessage(g_me,WM_MY_MOUSEACTI,wParam,lParam);break;} case WM_MOUSELEAVE :{SendMessage(g_me,WM_MY_MOUSELEAV,wParam,lParam);break;} case WM_SETFOCUS :{SendMessage(g_me,WM_MY_SETFOCUS,wParam,lParam);break;} case WM_KEYUP :{SendMessage(g_me,WM_MY_KEYUP,wParam,lParam);break;} case WM_KEYDOWN :{SendMessage(g_me,WM_MY_KEYDOWN,wParam,lParam);break;} } return ::CallWindowProc(oldWindowProc,hw,msg,wParam,lParam); } /** hook proc*/ #define pCW ((CWPSTRUCT*)lParam) LRESULT HookProc(int code,WPARAM wParam,LPARAM lParam){ /*check if we send message form MapDll or UnmapDll*/ if(pCW->message == WM_MYMESSAGE && pCW->lParam){ /*release hook*/ ::UnhookWndowsHookEx(gmy_hHook); /*if we already subclased procedure..callnext hook in chain..*/ if(gmy_isSubclassed) return ::CallNextHookEx(gmy_hHook,code,wParam,lParam); /*if not..*/ char lib_name[MAX_PATH]; /*Get full path of this module..*/ ::GetModuleFileName(hDll,lib_name,MAX_PATH); /*try to load dll*/ if(!::LoadLibrary(lib_name)){ return ::CallNextHookEx(gmy_hHook,code,wParam,lParam); } /*subclass window with my procedure*/ oldWindowProc =(WNDPROC)::SetWindowLong(gmy_hWnd,GWL_WNDPROC,(long)MyNewWindowProc); /*char str[128]; /*if we not succeed unload dll*/ if(oldWindowProc == NULL){ ::FreeLibrary(hDll); }else{ /*success*/ gmy_isSubclassed = true; } } return ::CallNextHookEx(gmy_hHook,code,wParam,lParam); } /*************************** MapDll ******************************************/ /*ova se funkcija zove iz moje aplikacije*/ int MapDll(HWND hwWinOther,HWND me){ gmy_hWnd = hwWinOther;/*njegove poruke hocu*/ g_me = me;/*primaos poruka*/ gmy_hHook = ::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc, hDll,::GetWindowThreadProcessId(gmy_hWnd,NULL)); if(gmy_hHook == NULL) return 0; /*0,1 parametars cos we'r using same HookProc - subclass window and load dll*/ ::SendMessage(gmy_hWnd,WM_MYMESSAGE,0,1); return gmy_isSubclassed; } exe sa pripadnim dll-om se moze skinuti sa: [url] http://www.oss.unist.hr/~ncaklovi/nwp/sem06.htm [/url] pod imenom spy ako netko zeli cijeli source neka mi javi na mail ako ima pitanja, prijedloga, zamjerki, primjedba, svaki savjet je dobro dosao, jer jeb... program koji ne radi. [Ovu poruku je menjao gmail_ dana 24.03.2006. u 14:19 GMT+1] |