C# - application redraw event

Címkék
C# - application redraw event
2010-11-18T02:08:46+01:00
2010-11-18T12:59:28+01:00
2022-11-19T21:30:49+01:00
Peets
üdv!

egy VNC server-t szeretnék kíserleti célra megírni C#-ban. itthon tightVNC-t használok. szeretnék megpróbálni egy módszert miszerint ( HA lehetséges ) a desktopon és a megnyitott programokon figyelek Redraw eventeket. azért írok ide, mert nem tudom, hogy ez lehetséges-e / megvalósítható-e, mert ezidáig nem találtam ezzel kapcsolatban leírást.

az alapötlet:
- csak akkor mentse le az egész desktopot HA szükség van rá, máskülönben...
- eventek figyelésével csak az újrarajzolt területeket mentse le "rétegekként" / "szeletekként", majd azokat elküldeni pozícióiformációkkal, hogy eredményesen lehessen rárajzolni az alapképre ( mint pl.: egy divx filmnél a kulcskockákra a deltakockákat ).

a kérdésem:
- ha a Redraw eventeket lehetséges "befogni" akkor azt hogyan csináljam? msdn-en nem találtam ilyen leírást / utalást :S

nagyon szívesen elfogadok bármilyen tanácsot, ötletet. köszi!
Mutasd a teljes hozzászólást!
Elvileg ha a rendszer kéri egy ablak valamely részének újrarajzolását, mindig egy WM_PAINT üzenetet küld az alkalmazásnak róla. Elvben ezt el tudod kapni egy WH_CALLWNDPROC hook segítségével. (Megadhatsz egy függvényt, ami minden üzenet kézbesítése előtt lefut.) Ilyet tudtommal csak natív kódban lehet írni, lassítja a rendszer futását, és egyébként is macerás. A másik dolog, hogy még így se tudod detektálni, ha a program "kérés nélkül" rajzol, vagyis nem a WM_PAINT eseményre reagálva.

Én a helyedben nem az újrarajzolások elkapására koncentrálnék, hanem bizonyos időközönként lementeném az egész képernyőt, aztán az előző mentéshez képest keresnék különbségeket. Jó esetben egyáltalán nem lesz különbség, vagy nagyon kis terület fog különbözni, így tudsz takarékoskodni az adatforgalommal.
Mutasd a teljes hozzászólást!

  • Szia!

    Tulajdonképpen te azt az eseményt szeretnéd 'elkapni', amikor a távoli felhasználó mozgatja a kliens gépen az egeret?

    Mert gondolom akkor kéne újrarajzolnod az egészet.

    Ötlet a megvalósításra:
    Létrehozod a kommunikációt a 2 gép között, én egy socket alapú tcp/ip protokolt csinálnék hozzá a megfelelő adattitkosítással.
    Amikor pl én a te gépedre rácsatlakozok azonnal elküldi az aktuális képernyőképet egy byte[] tömb-el amit aztán képpé alakítasz fogadáskor.
    A következő kommunikáció akkor következne be, amikor én mozgatom valamerre az egeret, ekkor az én gépem elküldi a te gépednek, hogy mi volt az előző koordináta és mi az új, és ebből a te géped ki tudja számolni, hogy az új koordinátája a kurzornak, és oda szépen be is tudja tenni. Természetesen itt képfelbontással meg egyébb szépségekkel lehet szívás de nem megoldhatatlan.
    Ha én kattintok azt is elküldi a gépem neked természetesen szépen beparaméterezve:
    -melyik gomb
    -koordináta
    -dátum(ha esetleg valami beragadt üzenet)
    A te géped megvizsgálja, min áll az egér és minek kell történnie kattintáskor, vagy talán a legegyzserűbbb, simán leszimulálod a te gépeden ugyanezt az eseményt, ami ott majd magától végrehajt valamit, pl megnyitja a lomtárat.

    Így első elképzelésre nagyon nagy vonalakban én így vágnék neki.
    Mutasd a teljes hozzászólást!
  • Elvileg ha a rendszer kéri egy ablak valamely részének újrarajzolását, mindig egy WM_PAINT üzenetet küld az alkalmazásnak róla. Elvben ezt el tudod kapni egy WH_CALLWNDPROC hook segítségével. (Megadhatsz egy függvényt, ami minden üzenet kézbesítése előtt lefut.) Ilyet tudtommal csak natív kódban lehet írni, lassítja a rendszer futását, és egyébként is macerás. A másik dolog, hogy még így se tudod detektálni, ha a program "kérés nélkül" rajzol, vagyis nem a WM_PAINT eseményre reagálva.

    Én a helyedben nem az újrarajzolások elkapására koncentrálnék, hanem bizonyos időközönként lementeném az egész képernyőt, aztán az előző mentéshez képest keresnék különbségeket. Jó esetben egyáltalán nem lesz különbség, vagy nagyon kis terület fog különbözni, így tudsz takarékoskodni az adatforgalommal.
    Mutasd a teljes hozzászólást!
  • VncSharp: A .NET VNC Client Library

    Tanács: ne írj új szervert a 0 ról.
    Ha ebben vmi nem tetszik, ird át benne, hisz opensource.
    A kód/dokumentáció böngészése igen sok ötletet adhat.
    Mutasd a teljes hozzászólást!
  • nagyon köszi a gyors választ, nagyon hasonló az elképzelésem ezzel kapcsolatban. máris "tisztult" a fejemben pár dolog. THX
    Mutasd a teljes hozzászólást!
  • thx a válaszod Csaboka, az összehasonlítás ötlet nagyon tetszik, valószínűleg ezzel fogok próbálkozni miután utánanéztem az általad említett WM_PAINT és WH_CALLWNDPROC hook-nak.
    Mutasd a teljes hozzászólást!
  • EZ IGEN! ez nagyon tetszik! THX
    tanulmányozom a működését és valószínűleg sokmindent ( ha nem az egészet XD ) felhasználom.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd