Einstieg in ...   C# für Anfänger


Einführung in die Programmiersprache C#

Hier sind alle diejenigen genau richtig, die soeben noch "Tse-Fis" sagten und nicht "ßi-Scharp".
Bei unseren Erläuterungen beziehen wir uns auf Windows 10, aber auch unter Windows 7
sollte der größte Teil möglich sein.

Ansprechen möchten wir zunächst den "Hobbybastler", der nur für seinen eigenen Bedarf
programmieren möchte.

Wichtig: Dies ist nur eine kleine Starthilfe, ohne Visual Studio und ohne Erklärung
von Begriffen wie "objektorientierte Programmierung", "Klassen", "Methoden" usw.

Eine vollständige Beschreibung aller Möglichkeiten ist hier nicht möglich, dazu benötigt man
mehrere hundert Seiten.

Stattdessen lauten die Ziele:

1.) schon in WENIGER ALS FÜNF MINUTEN
soll Ihr erstes C#-Programm starten!

2.) Sie sollen sich an das äußere Erscheinungsbild eines C#-Programms gewöhnen, das erleichtert
dann den "richtigen" Einstieg.

Vorteilhaft wären einige Grundkenntnisse im Umgang mit dem PC, z.B. der Vorgang "copy + paste".

Wir empfehlen, ein Programm und seine Befehlsabfolge mit den Ergebnissen zu vergleichen.
Wer tiefer einsteigen wil, sollte die angegebenen Übungen durchführen.

Besonders nett sind die Programme "Automatische Mausbewegungen und Tastatureingaben"
sowie das letzte Beispiel "Screenshots" zur unbemerkten Überwachung von Kindern!




Schritt eins, Anlegen einer Datei mit dem Namen "quellprogramm.cs"


Legen Sie eine Textdatei mit dem Namen "quellprogramm.cs" an, dazu verkleinern Sie zunächst dieses
Browser-Fenster und klicken mit der rechten Maustaste irgendwo auf den Desktop-Hintergrund.
Es geht dann weiter mit "Neu" und "Textdokument". Kopieren Sie dorthinein den folgenden
Programmtext beginnend mit "using System;" und endend mit der letzten geschweiften Klammer.
Wichtig ist die Dateiendung ".cs".



using System;
using System.Threading;

class Hello
{
    static void Main()
    {
        Console.WriteLine("Hello World!");
        Thread.Sleep(12000);
    }
}




Mit "Datei - Speichern unter..." und der Angabe des Dateinamens "quellprogramm.cs"
wird das Programm gespeichert. Später kommen nur zwei Programmzeilen zur Ausführung:
Die Ausgabe von "Hello World!" und zwölf Sekunden Wartezeit.



Schritt zwei, Kompilierung des Quellprogramms


Jetzt folgt die Kompilierung. Dabei entsteht aus dem Quelltext die für den Computer lesbare .exe-Datei.
In unserem Beispiel soll sie program.exe heißen.

Ziehen Sie den Cursor mit gedrückter linker Maustaste über die nachfolgende Anweisung,
verteilt auf zwei Zeilen mit Leerzeichen mittendrin. Nicht die Sterne mitnehmen!
Dann Rechtsklick und "Kopieren":


C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -out:C:\Users\EigenerName\Desktop\program.exe C:\Users\EigenerName\Desktop\quellprogramm.cs***


Nun erstellen wir das Zielfenster: <Windows-Taste> und <R> gleichzeitig drücken,
"cmd" eingeben, so dass jetzt ein schwarzes Fenster zu sehen ist. Dort einfügen mit der rechten Maustaste.
"EigenerName" ist zu ersetzen durch den entsprechenden Namen Ihres PC.
Die Cursorbewegungen sind etwas anders.

Jetzt die Enter-Taste drücken und es entsteht die Datei "program", die Definition zuvor war program.exe,
die Endung .exe wird weggelassen. Möglicherweise muss das schwarze Fenster etwas verschoben werden.




Schritt drei, Start des Programms


Nun das "program" anklicken und für 12 Sekunden gehen Grüße an die Welt !
Das schwarze Fenster schließt sich nach Programmende.

Es ist zweckmäßig, die Kommandozeile für den Kompiliervorgang in eine Datei mit dem Namen "compiler.ps1"
zu schreiben (bzw. "compiler.bat" bei Windows 7), dann erspart man sich einiges an Kopieren und Einfügen.
Auch hier gilt: die Endungen .ps1 und .bat sind wichtig, der Name "compiler" kann auch anders lauten.



Beispiel: Addition von zwei ganzen Zahlen


Nach der Eingabe von zwei ganzen Zahlen werden diese addiert und das Ergebnis ausgegeben.
"int" bedeutet, dass die Variablen summand1, summand2 und summe ganzzahlige Werte annehmen sollen.



using System;
using System.Threading;

class Addition
{
    static void Main()
    {
        Console.WriteLine("Dieses Programm addiert zwei Zahlen, die Sie eingeben.");
        Console.WriteLine(" ");
        int summand1, summand2, summe;
        Console.WriteLine("Bitte geben Sie eine ganze Zahl ein, z.B. 328874");
        summand1 = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Bitte geben Sie eine zweite ganze Zahl ein");
        summand2 = Convert.ToInt32(Console.ReadLine());
        summe = summand1 + summand2;
        Console.WriteLine(" ");
        Console.WriteLine("Das Ergebnis ist: " + summe);
        Thread.Sleep(10000);
    }
}

Übungsvorschlag 1: eine Differenz bilden.

Übungsvorschlag 2: auch die beiden Summanden ausgeben.



Beispiel: Multiplikation von zwei Dezimalzahlen





using System;
using System.Threading;

class Multiplikation
{
    static void Main()
    {
        Console.WriteLine("Dieses Programm multipliziert zwei Zahlen, die Sie eingeben.");
        Console.WriteLine(" ");
        double m1, m2, prod ;
        Console.WriteLine("Bitte geben Sie eine Zahl ein");
        m1 = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("Bitte geben Sie eine zweite Zahl ein");
        m2 = Convert.ToDouble(Console.ReadLine());
        prod = m1 * m2;
        Console.WriteLine(" ");
        Console.WriteLine("Das Ergebnis ist: " + prod);
        Thread.Sleep(10000);
    }
}





Beispiel: Aufruf von Methoden



Es ist Absicht, dass wir an dieser Stelle keine Erläuterungen geben.
Wer sich über Namen wie holleri und hollera wundert: wir wollen deutlich machen, an welchen
Stellen Sie die von Ihnen gewählten Variablennamen setzen müssen. In Handbüchern ist das
nicht immer sofort erkennbar.



using System;
using System.Threading;

class Methoden
{
    static void Main()
    {
        Console.WriteLine("Guten Tag!");
        Console.WriteLine("      ");
        hollera();
        holleri();
        Thread.Sleep(500);
        Console.WriteLine("      ");
        Console.WriteLine("Dudödldi!");
        Console.WriteLine("      ");
        Console.WriteLine("Drücken Sie eine beliebige Taste zum Verlassen.");
        Console.ReadKey();
    }
    static void holleri()
    {
        Console.WriteLine("Hier ist die Methode holleri.");
    }
    static void hollera()
    {
        Console.WriteLine("Und hier ist die Methode hollera.");
    }
}




Beispiel: Aufruf von Methoden mit Datenübergabe





using System;
using System.Threading;

class Program
{
    static void Main()
    {
        holleri("Leonie ", "Finn ");
        hollera("Ayshe " , "Lukas ");
        Thread.Sleep(10000);
    }
    static void holleri(string kindername1, string kindername2)
    {
        Console.WriteLine("Willkommen " + kindername1 + "und " + kindername2 + "!");
    }
    static void hollera(string weitereskind3, string weitereskind4)
    {
        Console.WriteLine("Wir begrüßen auch " + weitereskind3 + "und " + weitereskind4 + "!");
    }
}




Beispiel: Lesen von Daten aus einer Textdatei


Im Folgenden können Datensätze einer Datei und dann anschließend Felder daraus eingelesen werden.
Vorher muss die Datei mit dem Namen "testdatei.txt" angelegt sein. Um Tipparbeit einzusparen, sind hier
einige Tiere aufgelistet. Diese sind nach testdatei.txt zu kopieren.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;

class ReadFromFile
{
    static void Main()
    {
        string eingabe = File.ReadLines("testdatei.txt").Skip(2).Take(1).First();
        string[] seg;
        seg = eingabe.Split(';');
        int i = 5 ;
        Console.WriteLine( seg[i] );
        Thread.Sleep(15000);
    }

    /*
    Bär;Dachs;Taube;Hirsch;Kuh;Pferd
    Hund;Katze;Maus;Tiger;Reh;Schwein
    Meise;Aal;Hering;Wal;Zebra;Eisbär;Butt;Seepferdchen;Gorilla
    Eule;Adler;Igel;Amsel;Schwan;Seehund;Biber
    Fuchs;Marder,Iltis;Möwe;Biene;Motte;Elefant;Nilpferd
    Antilope;Giraffe
    */
}

Übungsvorschlag 1: Was passiert, wenn Sie auf Skip(3).Take(2) ändern?

Übungsvorschlag 2: Das Programm so zu ändern und zu erweitern, dass die Tiere
"Reh" und "Biene" erscheinen.

Übungsvorschlag 3: Um einen Fehler hervorzurufen, auf Skip(10) ändern.


Übungsvorschlag 4: Dann wieder auf Skip(2) zurück und int i= 10 setzen.



Beispiel: Schreiben von Texten in eine Datei


Hier werden sechs Textzeilen in die Datei Ausgabe.txt geschrieben. Falls diese nicht existiert, wird
sie erstellt. Wenn Ausgabe.txt bereits vorhanden ist, werden die Datensätze angehängt.

Der Name "EigenerName" ist zu ersetzen durch den entsprechenden Ordnernamen Ihres PC.
Zu Übungszwecken ist dieses Programm kein Problem. In der Praxis sieht es etwas anders aus:
Es könnte sein, dass "Ausgabe.txt" schreibgeschützt ist. Da arbeitet man mit "try" und "catch",
was wir hier nicht näher behandeln.



using System;
using System.IO;
using System.Text;

class Test
{
    static void Main()
    {
        FileStream hipphipp;
        StreamWriter hurrahurra;
        string dateiname = "C:\\Users\\EigenerName\\Desktop\\Ausgabe.txt";
        hipphipp = new FileStream(dateiname, FileMode.Append);
        hurrahurra = new StreamWriter(hipphipp);
        hurrahurra.WriteLine("Datensatz 1");
        hurrahurra.WriteLine("Datensatz 2");
        hurrahurra.WriteLine("Datensatz 3");
        hurrahurra.WriteLine(" ");
        hurrahurra.WriteLine("-----------");
        hurrahurra.WriteLine(" ");
        hurrahurra.Close();
    }
}




Beispiel: Automatisierung von Mausbewegungen und Tastatureingaben


Ein recht interessantes Programm mit vielen Möglichkeiten!!!
Zu beachten ist, dass die Bildschirmkoordinaten abweichen können. Mit geeigneten Apps
aus dem Netz können diese angezeigt werden, so dass man sich Pixelzählen mit einer Lupe sparen kann.

Zunächst startet das Programm den google-Browser, der muss natürlich vorher installiert sein.
Ansonsten im quellprogramm.cs die entsprechende Zeile ersetzen durch beispielsweise
"Process.Start("C:\\Program Files\\Mozilla Firefox\\firefox.exe");".
Manchmal ist auch "Process.Start("C:\\Programme\\Google\\Chrome\\Application\\chrome");" erforderlich,
hier hilft leider nur ausprobieren.

Vor dem Start sollten keine minimierten Fenster auf der Taskleiste sein.

Es kann passieren, dass sich der Mauszeiger verirrt, dann einfach nochmal starten.



// Kommmentarzeilen, beginnen mit zwei Schrägstrichen und werden bei der
// Kompilierung nicht berücksichtigt
using System;
using System.Threading;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("user32", EntryPoint = "mouse_event")]
    private static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, IntPtr dwExtraInfo);
    private const Int32 MouseEventAbsolute = 0x8000;
    private const Int32 MouseEventLeftDown = 0x0002;
    private const Int32 MouseEventLeftUp = 0x0004;
    private const Int32 MouseEventMiddleDown = 0x0020;
    private const Int32 MouseEventMiddleUp = 0x0040;
    private const Int32 MouseEventMove = 0x0001;
    private const Int32 MouseEventRightDown = 0x0008;
    private const Int32 MouseEventRightUp = 0x0010;
    private const Int32 MouseEventXDown = 0x0080;
    private const Int32 MouseEventXUp = 0x0100;
    private const Int32 MouseEventWheel = 0x0800;
    private const Int32 MouseEventHWheel = 0x01000;
    static void Main()
    {
        Console.WriteLine("Start");
        Thread.Sleep(1000);
        //Process.Start("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
        Process.Start("C:\\Programme\\Google\\Chrome\\Application\\chrome");
        Thread.Sleep(2000);
        SendKeys.SendWait("www.clavius.info");
        Thread.Sleep(2000);
        SendKeys.SendWait("{ENTER}");
        Thread.Sleep(1000);
        Cursor.Position = new System.Drawing.Point(100, 100);
        Thread.Sleep(1000);
        mouse_event(MouseEventMove, 50, 50, 0, new IntPtr());
        Thread.Sleep(1000);
        mouse_event(MouseEventMove, 50, 50, 0, new IntPtr());
        Thread.Sleep(1000);
        mouse_event(MouseEventMove, 50, 50, 0, new IntPtr());
        Thread.Sleep(1000);
        //Mausrad drehen
        mouse_event(MouseEventWheel, 0, 0, -120, new IntPtr());
        Thread.Sleep(1000);
        mouse_event(MouseEventWheel, 0, 0, -120, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventWheel, 0, 0, 120, new IntPtr());
        Thread.Sleep(1000);
        mouse_event(MouseEventWheel, 0, 0, 120, new IntPtr());
        Thread.Sleep(1000);
        Cursor.Position = new System.Drawing.Point(1000, 450);
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftDown, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventMove, 1, 200, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventMove, -1, -100, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventMove, 50, 1, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventMove, -50, 1, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftUp, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        //Fenster schließen
        Cursor.Position = new System.Drawing.Point(2000, 0);
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftDown, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftUp, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        Console.WriteLine("Schützenliesel, dreimal hat's gekracht");
        Thread.Sleep(2000);
        //Process.Start("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
        Process.Start("C:\\Programme\\Google\\Chrome\\Application\\chrome");
        SendKeys.SendWait("{ENTER}");
        Thread.Sleep(2000);
        SendKeys.SendWait("www.sv-hilter.de");
        SendKeys.SendWait("{ENTER}");
        Thread.Sleep(5000);
        for (int i = 1; i <= 16; i++)
        {
           SendKeys.SendWait("{TAB}");
           Thread.Sleep(1000);
        }
        SendKeys.SendWait("{ENTER}");
        Thread.Sleep(2000);
        Cursor.Position = new System.Drawing.Point(1001,421);
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftDown, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        mouse_event(MouseEventLeftUp, 0, 0, 0, new IntPtr());
        Thread.Sleep(2000);
        SendKeys.SendWait("{ENTER}");
        Thread.Sleep(2000);
        SendKeys.SendWait("{TAB}");
        Thread.Sleep(2000);
        SendKeys.SendWait("Larry");
        Thread.Sleep(2000);
        SendKeys.SendWait("{TAB}");
        Thread.Sleep(2000);
        SendKeys.SendWait("larry@gmx.de");
        Thread.Sleep(2000);
        SendKeys.SendWait("{TAB}");
        Thread.Sleep(2000);
        SendKeys.SendWait("Ein Hoch den wackeren Schützen! ");
    }
}

Übungsvorschlag: zwei Tastendrucke gleichzeitig simulieren. Das geht aber nur mit Hilfe
von Dokumentation im Internet.



Beispiel: Ausgabe der Primzahlen von 2-20.000 in eine Tabelle


In der Praxis wäre die hier vorgestellte Art, Primzahlen zu berechnen, völlig ungeeignet.
Wenn man eine Zahl testet, dann genügt es, die Divisionen bis zur Wurzel aus der Zahl durchzuführen.
Also die Zahl 1.000 muss nur durch maximal 31 geteilt werden. "Math.Truncate" schneidet Nachkommastellen ab.
Die Zeile "div= kandidat % primf;" sorgt dafür, dass "div" nur die Nachkommastellen enthält.
Zu beachten die Primzahllücke (39 Stück) zwischen 19.333 und 19.373 .
Es gibt unendlich viele Primzahlen (Beweis von Euklid).
Es gibt beliebig große Primzahllücken (Beweis mit Fakultäten, also z.B. (7*6*5*4*3*2) + 2
ist durch 2 teilbar, (7*6*5*4*3*2) + 3 ist durch 3 teilbar...(7*6*5*4*3*2) + 7 ist durch 7 teilbar.
Somit hat man 6 aufeinanderfolgende Nichtprimzahlen.

Auch hier gilt: "EigenerName" im Quellprogramm muss ersetzt werden.




using System;
using System.IO;
using System.Text;
using System.Threading;

class Primzahltest
{
    static void Main()
    {
        Console.WriteLine("Start, Dauer etwa 20 Sekunden, Ende-Meldung abwarten");
        int kandidat;
        for (kandidat = 2; kandidat<=20000; kandidat++)
        {
            primzahlfeststellung(kandidat);
        }
        Console.WriteLine("Ende des Programms");
        Thread.Sleep(3000);
    }

    static void primzahlfeststellung(int kandidat)
    {
        double div=0;
        double wurzelauskdt=0;
        double wurzelaus=0;
        double primf=0;
        double pverd=0;
        wurzelaus= Math.Sqrt(kandidat);
        wurzelauskdt= Math.Truncate(wurzelaus);
        for (primf = 2; primf<=wurzelauskdt; primf++)
        {
            div= kandidat % primf;
            if (div != 0)
            {
                pverd=0;
            }
            else
             {
                pverd=1;
                break;
             }
        }

        //Auswertung, ob der Kandidat eine Primzahl ist oder nicht
        if (pverd == 1)
        {
        }
        else
         {
                ausgabe(kandidat);
         }
    }

    //Ausgabe jeder Primzahl auf Primzahlen.txt
    static void ausgabe(int kandidat)
    {
        FileStream hipphipp;
        StreamWriter hurra;
        string dateiname = "C:\\Users\\EigenerName\\Desktop\\Primzahlen.txt";
        hipphipp = new FileStream(dateiname, FileMode.Append);
        hurra = new StreamWriter(hipphipp);
        hurra.WriteLine(kandidat);
        hurra.Close();
    }
}

Übungsvorschlag: ebenfalls alle Nicht-Primzahlen ausgeben, jedoch dargestellt mit "*".
So lassen sich schnell Primzahllücken erkennen.



Beispiel: Einige mathematische Funktionen





using System;
using System.Threading;

class Funktionen
{
    static void Main()
    {
        Console.WriteLine("Die Eulersche Zahl e und die Kreiszahl pi lauten: " + Math.E + " " +"und " + Math.PI);
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine("Potenzieren zweier Zahlen");
        Console.WriteLine(" ");
        double m1, m2, potenz ;
        Console.WriteLine("Bitte geben Sie die Basis ein");
        m1 = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("Bitte geben Sie den Exponenten ein");
        m2 = Convert.ToDouble(Console.ReadLine());
        potenz = Math.Pow(m1, m2);
        Console.WriteLine("Das Ergebnis ist: " + potenz);
        Thread.Sleep(3000);
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        m1=0;
        m2=0;
        potenz=0;
        Console.WriteLine("Potenzieren mit der Basis e");
        Console.WriteLine(" ");
        Console.WriteLine("Bitte geben Sie den Exponenten ein");
        m1 = Convert.ToDouble(Console.ReadLine());
        potenz=Math.Exp(m1);
        Console.WriteLine("Das Ergebnis ist: " + potenz);
        Thread.Sleep(3000);
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Thread.Sleep(3000);
        Console.WriteLine("Sinus aus einem Winkel");
        Console.WriteLine(" ");
        double alpha, sinalpha;
        Console.WriteLine("Bitte geben Sie einen Winkel in Grad ein");
        alpha = Convert.ToDouble(Console.ReadLine());
        sinalpha = Math.Sin(alpha*Math.PI/180);
        Console.WriteLine("Der Sinus aus " + alpha + " Grad ist " + sinalpha);
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine(" ");
        Console.WriteLine("Drücken Sie eine beliebige Taste zum Verlassen");
        Console.ReadKey();
    }
}

Übungsvorschlag: den Logarithmus einer Zahl zur Basis 10 und zur Basis e berechnen.
Dazu werden jedoch Dokumentation aus dem Internet oder Handbücher erforderlich sein.



Beispiel: Zufallszahlengenerator


Der C#-Zufallszahlengenerator ist eher ungeeignet, erst recht, wenn man größere
Mengen von ihnen braucht. Das Entfernen der beiden Kommentar-Schrägstriche bringt
nichts, erst das Herausziehen von "var r = new Random();" aus der Schleife verkleinert
das Problem der doppelten und der aufsteigenden Zahlen etwas.




using System;
using System.Threading;

class Zufall
{
    static void Main()
    {
        for (int i=0; i<100; i++)
        {
            var r = new Random();
            int a = r.Next(10,20);
            Console.WriteLine(a);
            //Thread.Sleep(1000);
        }
        Console.WriteLine("Ende");
        Thread.Sleep(100000);
    }
}







Letztes Beispiel: Screenshots


Sie wollen Ihre Kinder kontrollieren und wissen, was diese so im Internet treiben? Kein Problem.
Hier brauchen wir zwei Programme, das zweite ruft das erste auf. Man kann beide gemeinsam
in einem beliebigen Ordner verstecken. Der Pfadname muss natürlich angepasst werden.
Das Programm ist unverträglich mit manchen geöffneten Systemfenstern.
Auch der Mauszeiger erscheint nicht. Unter Windows 10 mit Hilfe
der Aufgabenplanung alle 5 Minuten oder nach Bedarf starten.




using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
    [STAThread]
    static void Main()
    {
        DateTime date = new DateTime();
        date = DateTime.Now;
        string stempel = date.ToString("yyyyMMddHHmmss");
        SendKeys.SendWait("{PRTSC}");
        Image myImage = Clipboard.GetImage();
        myImage.Save("C:\\Users\\Eigenername\\Desktop\\bild" + stempel +".jpg");
    }
}




Nach dem Kompilieren program umbenennen in program1.
Dann das folgende zweite Programm kompilieren.


using System;
using System.Windows.Forms;
using System.Diagnostics;

class Program
{
    [STAThread]
    static void Main()
    {
        string exePath = "program1.exe";
        string arguments = "";
        Process process = new Process();
        process.StartInfo.FileName = exePath;
        process.StartInfo.Arguments = arguments;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();
        Environment.Exit(0);
    }
}

Warum so kompliziert, dass ein Programm ein anderes aufruft? Es ist leider so, dass
auf dem Bildschirm-Shoot das schwarze cmd-Fenster erscheinen würde. Um dieses zu
verhindern, bauen wir vorher eine Art "Verzögerung" ein.





An dieser Stelle ist die kleine Einführung in C# beendet und man sollte ab jetzt mit Visual Studio 2019
(Download kostenlos) weiterarbeiten. Kleiner Hinweis: Unter Windows Forms-App wird "SendKeys"
nicht anerkannt, aus mir nicht verständlichen Gründen. Also dort das Beispiel "Automatisierung
von Mausbewegungen und Tastatureingaben" mit "Konsolen App" bearbeiten. Des weiteren empfehlen
wir "C# Tutorial Deutsch" auf youtube und das Buch "Einstieg in C# mit Visual Studio 2019"
von Thomas Theis aus dem Rheinwerk-Verlag. Tipp: In Visual Studio immer den Projektmappen-Explorer
öffnen. Zu finden unter "Ansicht".

Viel Erfolg!












Anhang: Test auf Vorhandensein notwendiger Komponenten


Falls das Kompilieren zu Fehlern führen sollte, empfiehlt sich folgende Prüfung:
Klicken Sie auf das Windows-Startsymbol mit der rechten Maustaste. Dann auf

Explorer >
Dieser PC >
Lokaler Datenträger (C:) >
Windows >
Microsoft.NET >
Framework >
v4.0.30319 .

In dem letzten geöffneten Ordner sollte unter anderem "csc" stehen.



Hat Ihnen diese kurze Einführung genützt?
Können wir Verbessserungen vornehmen?
Schreiben Sie uns, maximal 1.000 Zeichen.