Samstag, 24. Juli 2010

Spaßprogramm: Screenshot vom Desktop als Hintergrund und alle Icons löschen

Änderung 30.08.10: Zu diesem Post gibt's jetzt auch ein Youtube Video auf meinem Kanal.

Zuallererst: Achtung! Mit dem hier gezeigten Beispielcode können u.a. Daten verloren gehen, auf jeden Fall kommt die Reihenfolge der Icons auf dem Desktop durcheinander - ich übernehme keinerlei Verantwortung für irgendwelche negativen Folgen.

Und jetzt mal worum es geht: Heute möchte ich euch ein kleines Spaßprogramm zeigen, mit dem man andere Leute wunderbar veräppeln kann.
Das Programm macht einen Screenshot vom Desktop, versteckt dann die Taskleiste und verschiebt alle Icons vom Desktop.
Anschließend legt das Programm den Screenshot als Wallpaper fest. So hat es den Anschein, als ob alle Icons und die Taskleiste noch ganz normal vorhanden wären, allerdings sind sie nicht mehr anklickbar!
Die Dateien und Symbole auf dem Desktop werden nicht gelöscht, sondern in ein Backupverzeichnis geschoben. Der ganze Spaß (bis auf den Hintergrund, der muss manuell geändert werden) kann mit dem Programm aus dem nächsten Post rückgängig gemacht werden.

Alle Tricks, die in diesem Programm benutzt wurden, habe ich in den vorigen Posts genauer beschrieben, deswegen verzeit ihr mir hoffentlich, wenn dieser Quellcode nicht sehr ausführlich kommentiert ist. Den Code könnt ihr einfach in eine Windows Forms-Anwendung hineinkopieren und dabei den Code des Formulars Form1 überschreiben. Auf dem Formular muss ein Timer (timer1) vorhanden sein:

    public partial class Form1 : Form
    {

        [DllImport("user32.dll")]
        private static extern int FindWindow(string className, string windowText);

        [DllImport("user32.dll")]
        private static extern int ShowWindow(int hwnd, int command);


        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni);
        private static UInt32 SPI_SETDESKWALLPAPER = 20;
        private static UInt32 SPIF_UPDATEINIFILE = 0x1;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // alle Fenster minimieren
            Type typeShell = Type.GetTypeFromProgID("Shell.Application");
            object objShell = Activator.CreateInstance(typeShell);
            typeShell.InvokeMember("MinimizeAll", System.Reflection.BindingFlags.InvokeMethod, null, objShell, null);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int StartX, StartY;
            int Width, Height;

            StartX = 0;
            StartY = 0;
            Width = Screen.PrimaryScreen.Bounds.Width;
            Height = Screen.PrimaryScreen.Bounds.Height;

            Bitmap Screenshot = new Bitmap(Width, Height);

            // warten, dass alle Fenster minimiert werden
            for (int i = 0; i < 1000; i++)
                if (i % 100 == 0)
                    System.Threading.Thread.Sleep(100);

            // Screenshot vom Bildschirm erstellen
            Graphics G = Graphics.FromImage(Screenshot);

            G.CopyFromScreen(StartX, StartY, 0, 0, new Size(Width, Height), CopyPixelOperation.SourceCopy);

            Screenshot.Save("C:\\1.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
            Screenshot.Dispose();

            G.Dispose();

            string filename = "C:\\1.bmp";

            // Taskleiste verstecken
            int hwnd = FindWindow("Shell_TrayWnd", "");
            ShowWindow(hwnd, 0);

            SystemParametersInfo(20, 0, filename, 0x01 | 0x02);
            
            DirectoryInfo ds = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));

            // in dieses Verzeichnis werden alle Dateien vom Desktop hin verschoben
            string BackupDirectory = @"C:\backupdesktopfun\";

            if (!Directory.Exists(BackupDirectory))
                Directory.CreateDirectory(BackupDirectory);

            foreach (FileInfo f in ds.GetFiles())
            {
                if (!File.Exists(BackupDirectory + f.Name))
                    f.MoveTo(BackupDirectory + f.Name);
            }

            foreach (DirectoryInfo d in ds.GetDirectories())
            {
                if (!Directory.Exists(BackupDirectory + d.Name))
                    d.MoveTo(BackupDirectory + d.Name);
            }

            Application.Exit();
        }
    }

Kommentare:

  1. Hallo,

    was mir bei deinem, Code vorallem immer ins Auge fällt, du verwendest verschiedene Conventionen der Schreibweise. Manchmal schreibste was groß, manchmal was klein. Z.B.:
    int StartX
    int hwnd

    Du solltest (also zumindest finde ich sowas immer gut) auf einen einheitlichen Stil achten.

    Orientiere dich hier vielleicht an der Code Convention von Microsoft.

    Grüße

    AntwortenLöschen
  2. Hallo,

    danke für die Meinung, du hast Recht, ich finde einen einheitlichen Stil auch sehr wichtig.
    Grundsätzlich versuche ich mich an die Code Convention von Microsoft zu halten, also z.B. Pascal case bei Klassenvariablen und Camel case bei Methodenparametern.
    Kleine "Ausrutscher", wie int hwnd, sollten eigentlich nur bei alten WinAPI - Funktionen vorkommen, denn in der Literatur werden die Variablen dort meistens auch auf diese Art benannt.

    Grüße

    AntwortenLöschen
  3. Funktioniert bei Windows 7 nicht... jedenfalls bei mir nicht!

    AntwortenLöschen