[ Milan Milosevic @ 26.10.2001. 14:52 ] @
Ukoliko se neko intenzivnije bavio presretanjem windows-ovih poruka mozda moze da mi pomogne.Pokusavam da iz moje aplikacije presretnem poruke koje windows sanje drugim prozorima, ali mi ne polazi za rukom.
Probao sam sa koriscenjem timer komponente, gde na njegov dogadaj upisao sledeci kod
Var
Msg:Tagmsg;
begin
Getmessage(Msg,handle,0,0);
Translatemessage(msg);
Dispatchmessage(msg);
End;

To lepo radi ukoliko za handle postavim handle maticne forme ili aplikacije.Medutim ukoliko postavim pokazivac na neku komponentu unutar forme ili na neku drugu formu
Dolazi do potpunog zastoja ,sve dok se ne desi neki dogadaj za tu komponentu,a za druge aplikacje dolazi do potpune blokade.Probao sam da u mesto getmessage koristim peekmessage, i to prolazi, ali poruke koje vraca nemaju blage veze sa zivotom.




[ Ivan Dimkovic @ 26.10.2001. 15:00 ] @
Ne radim programiranje u Delphi-ju, ali cu ti dati generalni odgovor (vezan za C Win32 programiranje), siguran sam da i u Delphi-ju moze to da se uradi na vrlo slican nacin.

Napravis svoj WndProc koji obradjuje poruke koje te zanimaju a na kraju zove zapamceni originalni dispatcher koji ces dobiti sa:

GetWindowLong(hwnd, GWL_WNDPROC);

Prozoru setujes novi dispatcher sa SetWindowLong(hwnd, GWL_WNDPROC, adresatvojeprocedur)

Ovo radi samo ako je taj prozor u tvom procesu (imaju isti handle) ako koristis NT. Pod w9x radi za svaki prozor.
[ Milan Milosevic @ 27.10.2001. 08:03 ] @
Ovo je potpuno ludo i radi ,samo nisam ukapirao jos kako da artikulisem poruke koje dolaze.Nije mi bas naj jasnije kako da uhvatim poruke koje mi trebaju.
Ako ti nije tesko mogao bi da mi napises jedan mali primer za bilo koji dogadaj .Nema veze sto je u c-u .Kapiram doneke i njega.U principu i c i delphi su potpuno isti ,samo im je sintaxa razlicita.
U buducnosti mi je plan da naucim i c++.
Unapred hvala.
[ Ivan Dimkovic @ 27.10.2001. 09:32 ] @
evo, ovako bi to tebalo da ide (verovatno ima gresaka, ali je to princip):

Mozes slicnu stvar da uradis i sa SetWindowsHookEx(), pogledaj MSDN

Da, mozes i da pozoves originalnu proceduru PRE tvoje obrade, recimo to je dobra ideja za WM_PAINT procesiranje (kada kontrola/prozor zavrsi svoje crtanje a onda ti dodas nesto, na primer ikonicu na dugme u zavisnosti od statusa, itd..)

Code:

WNDPROC OrigProc; // originalna procedura

LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam)
{         

  switch (message)  {
    case WM_PAINT:
          // Prozor je dobio WM_PAINT poruku, radis obradu
    break;

    case WM_LBUTTONDOWN:
          // Levo dugme misa je pritisnuto
    break;

    default:
  }

  /* zovi originalnu proceduru */
  return (OrigProc)(hWnd, message, wParam, lParam);
}

void DeoKoda()
{
    /* evo kako da instaliras 'peek' proceduru */
    HWND prozorKojiTeZanima;

    OrigProc = GetWindowLong(prozorKojiTeZanima, GWL_WNDPROC);
    SetWindowLong(prozorKojiTeZanima, GWL_WNDPROC, (WNDPROC)MainWndProc);
}



[Ovu poruku je menjao Ivan Dimkovic dana 28.10.2001 u 11:18 AM GMT]
[ Makojdis @ 27.10.2001. 21:20 ] @
ubaci kod u [ code ]
[ Ivan Dimkovic @ 28.10.2001. 02:40 ] @
Pa ubacen je...