Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

presretanje poruka drugih prozora

[es] :: C/C++ programiranje :: presretanje poruka drugih prozora

[ Pregleda: 1977 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gmail_
Zg

Član broj: 85877
Poruke: 15
*.adsl.net.t-com.hr.



Profil

icon presretanje poruka drugih prozora24.03.2006. u 12:21 - pre 220 meseci
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]
 
Odgovor na temu

gmail_
Zg

Član broj: 85877
Poruke: 15
*.adsl.net.t-com.hr.



Profil

icon Re: presretanje poruka drugih prozora25.03.2006. u 17:57 - pre 220 meseci
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?
 
Odgovor na temu

stargazer
bgd

Član broj: 85916
Poruke: 117
*.eunet.yu.



Profil

icon Re: presretanje poruka drugih prozora25.03.2006. u 18:50 - pre 220 meseci
A da li se ruši pri nekoj određenoj poruci ili pri svakoj od tih navedenih?
With no lovin' in our souls and no money in our coats you can't say we're satisfied
 
Odgovor na temu

gmail_
Zg

Član broj: 85877
Poruke: 15
*.adsl.net.t-com.hr.



Profil

icon Re: presretanje poruka drugih prozora25.03.2006. u 19:37 - pre 220 meseci
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
 
Odgovor na temu

[es] :: C/C++ programiranje :: presretanje poruka drugih prozora

[ Pregleda: 1977 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.