IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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

Další z kolekce mých programů, vytvořených z nudy na hodinách počítačů ve škole. Program, který má vystrašit nezkušeného uživatele tím, že předstírá rozbitou obrazovku. Je vytvořen ve WPF a používá pointery a přímou práci s pamětí (kvůli rychlosti), je tudíž spíše pro zkušenější uživatele.

Zobrazí se v podobě Topmost okna přes celou virtuální plochu (všechny obrazovky), které nereaguje na Alt + F4. Nejdříve se Opacity okna nastaví na 0.01, aby prakticky úplně průhledné, ale uživatel nemohl nikam klikat. Poté se udělá screenshot čisté obrazovky, s určitým offsetem se pak invertovaný vykreslí sám přes sebe, v obrázku se udělá ruch a výsledek se zobrazí v Image. Poté se Opacity okna nastaví zase na 1 (tedy úplně neprůhledné), aby uživatel glitch viděl. Pak se určitou dobu počká, a celý cyklus se opakuje. Výsledkem je přeskakující obrazovka jako v hackerkých filmech.

Rychlost

Kvůli rychlosti se pracuje přímo s pamětí a pointery, pixely obrázku se procházejí ve dvou for cyklech, uvnitř kterých se vždy přepočítá, kde v paměti se aktuální pixel nachází. Pokud je daný pixel za vypočítaným offsetem, překreslí se posunutým obrázkem a invertuje se. Každý pixel má taky určitou šanci se odchýlit od své barvy (tím se dělá ruch). Vše je nastavitelné parametry.

Kvůli rychlosti jsem také použil jeden trošičku "memory hack". Screenshot se v C# dělá třídou Graphics, ta pracuje se třídou Bitmap. Ta je na pozadí poháněna GDI+. WPF Image je ale na pozadí DirectX a konverze mezi nimi je možná jen tak, že se Bitmapa vykreslí do souboru či někam do paměti a pak se načte do WPF třídy BitmapImage. To je pomalé (C# na práci s grafikou není vhodný jazyk). WPF má ale jinou třídu jménem WritableBitmap, ze které lze získat pointer na fixní místo v paměti, kde jsou její surové pixely uloženy. Vytvoříme tedy tuto třídu a za pomoci jejího pointeru vytvoříme instanci třídy Bitmap (předáme pointer jejímu konstruktoru jako tzv. Scan0) nad stejnou oblastí v paměti (musíme dát pozor, abychom nastavili stejný formát pixelů a rozměry!). Díky tomu můžeme přes Graphics uložit do Bitmapy screenshot, upravovat ho a pak bez jakékoliv konverze změnu ihned zobrazit pomocí metody AddDirtyRect() (ta označí změněný region - v našem případě celý obrázek) na třídě WritableBitmap (která je nastavena jako Source zobrazovacího Image).


Galerie

Program byl vytvořen v roce 2018.

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 41x (221.01 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Všechny články v sekci
Zdrojákoviště C# .NET - Okenní aplikace WPF
Program pro vás napsal jiri.sada
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
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