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;
}
/**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]