Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Rozbitá obrazovka

Ďalší z kolekcie mojich programov, vytvorených z nudy na hodinách počítačov v škole. Program, ktorý má vystrašiť neskúseného užívateľa tým, že predstiera rozbitú obrazovku. Je vytvorený vo WPF a používa Pointer a priamu prácu s pamäťou (kvôli rýchlosti), je teda skôr pre skúsenejších užívateľov.

Zobrazí sa v podobe Topmost okna cez celú virtuálnu plochu (všetky obrazovky), ktoré nereaguje na Alt + F4. Najskôr sa Opacity okna nastaví na 0.01, aby prakticky úplne priehľadné, ale užívateľ nemohol nikam klikať. Potom sa urobí screenshot čisté obrazovky, s určitým offsetom sa potom invertovaný vykreslí sám cez seba, v obrázku sa urobí ruch a výsledok sa zobrazí v Image. Potom sa Opacity okna nastaví zase na 1 (teda úplne nepriehľadné), aby užívateľ glitch videl. Potom sa určitú dobu počká, a celý cyklus sa opakuje. Výsledkom je preskakujúci obrazovka ako v hackerkých filmoch.

Rýchlosť

Kvôli rýchlosti sa pracuje priamo s pamäťou a Pointer, pixely obrázku sa prechádzajú v dvoch for cykloch, vnútri ktorých sa vždy prepočíta, kde v pamäti sa aktuálnej pixel nachádza. Ak je daný pixel za vypočítaným offsetom, prekreslí sa posunutým obrázkom a invertuje sa. Každý pixel má taky určitú šancu sa odchýliť od svojej farby (tým sa robí ruch). Všetko je nastaviteľné parametre.

Kvôli rýchlosti som tiež použil jeden trošičku "memory hack". Screenshot sa v C# robí triedou Graphics, tá pracuje sa triedou Bitmap. Tá je na pozadí poháňaná GDI +. WPF Image je ale na pozadí DirectX a konverzie medzi nimi je možná len tak, že sa Bitmapa vykreslí do súboru či niekam do pamäte a potom sa načíta do WPF triedy BitmapImage. To je pomalé (C # na prácu s grafikou nie je vhodný jazyk). WPF má ale inú triedu menom WritableBitmap, z ktorej možno získať pointer na fixné miesto v pamäti, kde sú jej surovej pixely uložené. Vytvoríme teda túto triedu a za pomoci jej Pointer vytvoríme inštanciu triedy Bitmap (odovzdáme pointer jej konštruktory ako tzv. Scan0) nad rovnakou oblasťou v pamäti (musíme dať pozor, aby sme nastavili rovnaký formát pixelov a rozmery!). Vďaka tomu môžeme cez Graphics uložiť do Bitmapy screenshot, upravovať ho a potom bez akejkoľvek konverzie zmenu ihneď zobraziť pomocou metódy AddDirtyRect () (tá označí zmenený región - v našom prípade celý obrázok) na triede WritableBitmap (ktorá je nastavená ako Source zobrazovacieho Image).


Galéria


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 41x (221.01 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
C # - Pre pokročilých
Program pre vás napísal jiri.sada
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v C#, stříhání a úpravou videí a efektů do nich, trollení svých kamarádů drobnými viry a obecně všemu okolo počítačů a elektroniky s Androidem
Aktivity