[ 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]
[ gmail_ @ 25.03.2006. 17:57 ] @
zaboravih reci da se krsi u:

Code:

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); // <-TU  SE KRSI
                                              
    
}


ideja?
[ stargazer @ 25.03.2006. 18:50 ] @
A da li se ruši pri nekoj određenoj poruci ili pri svakoj od tih navedenih?
[ gmail_ @ 25.03.2006. 19:37 ] @
Citat:
stargazer: A da li se ruši pri nekoj određenoj poruci ili pri svakoj od tih navedenih?


skrsi se odmah cim mi se otvori prozor za poruke, cak nekada zna i uloviti prvu poruku koja stilga.

ali da napomenem jos jednom, program mi radi za sve ostalo osim za explorer sto znaci da mogu gledat/lovljat poruke od: START buttona,toolbara, kalkulatora, painta, winampa,mozile, IEexplorer, VS-a, znaci bilo koje aplikacije i bilo koji prozor ako nema veze sa explorer.exe-om, (s tim da cak i neke hoce)

primjer:
zelim vidjet poruke od folder view-a

http://img382.imageshack.us/img382/6185/d19hr.jpg


i desi se:


http://img382.imageshack.us/img382/3743/b38bq.jpg


a za sve ostalo normalno radi i to je ono najgore

kompletan kod se moze skinuti sa:

http://www.planet-source-code....p?txtCodeId=10389&lngWId=3


Pozdrav