Rozbitá obrazovka

C# .NET Pro pokročilé Rozbitá obrazovka

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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ženo 12x (221.01 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Program pro vás napsal jiri.sada
Avatar
Jak se ti líbí článek?
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 (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!