<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3709808271825745441</id><updated>2012-02-08T16:27:41.690+01:00</updated><title type='text'>C# Tipps und Tricks</title><subtitle type='html'>In diesem Blog veröffentliche ich regelmäßig kleine Artikel mit Tipps und Tricks für die Sprache C# .Net.
C# ist eine moderne, objektorientierte Programmiersprache, die die Möglichkeiten des .Net Frameworks voll ausschöpft.
Die Schwierigkeit dieses Blogs soll ganz verschieden sein, von leicht bis schwer, für Anfänger bis Fortgeschrittene ist hoffentlich immer was dabei.
Wenn ihr Fragen oder Anregungen habt, schreibt mir einfach.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default?start-index=101&amp;max-results=100'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4016237411608229482</id><published>2012-01-14T12:41:00.003+01:00</published><updated>2012-01-18T10:55:33.057+01:00</updated><title type='text'>Drucken mit C#</title><content type='html'>In diesem Post möchte ich euch zeigen, wie man mit C# den Drucker ansteuern kann.&lt;br /&gt;Hierfür gibt es bestimmt einige Möglichkeiten, ich benutze hier die &lt;span style="font-style:italic;"&gt;Graphics&lt;/span&gt; Eigenschaft des Druckereignisses, das auszudruckende Resultat muss dann in dieser gezeichnet werden.&lt;br /&gt;&lt;br /&gt;Zuerst muss &lt;span style="font-style:italic;"&gt;System.Drawing.Printing&lt;/span&gt; eingebunden werden.&lt;br /&gt;Die folgende Zeile initialisiert uns das benötigte Objekt, welches das zu druckende Dokument repräsentiert.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;PrintDocument PrintDoc = new PrintDocument();&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Installierte Drucker sind in &lt;span style="font-style:italic;"&gt;PrinterSettings.InstalledPrinters&lt;/span&gt; gespeichert. In dieser Liste liegen die Namen der Drucker als Strings vor, zum Setzen des zu benutzenden Druckers benutzen wir&lt;span style="font-style:italic;"&gt; PrintDoc.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[Index]&lt;/span&gt;.&lt;br /&gt;Gedruckt wird das Dokument über den Befehl &lt;span style="font-style:italic;"&gt;PrintDoc.Print()&lt;/span&gt;.&lt;br /&gt;Vorher fügen wir dem Druckdokument allerdings eine Ereignisbehandlung für sein Druckereignis hinzu: &lt;span style="font-style:italic;"&gt;PrintDoc.PrintPage += new PrintPageEventHandler(PrintPage)&lt;/span&gt;.&lt;br /&gt;Hierbei ist PrintPage eine beliebige Funktion mit folgender Signatur: &lt;span style="font-style:italic;"&gt;void PrintPage(object sender, PrintPageEventArgs e)&lt;/span&gt;.&lt;br /&gt;Diese wird nun aufgerufen, wann immer ein Dokument gedruckt wird.&lt;br /&gt;In dieser können wir dann das gewünschte Druckresult erstellen, indem wir es in &lt;span style="font-style:italic;"&gt;e.Graphics&lt;/span&gt; zeichnen. Es können z.B. auch Bilder eingelesen werden und dort hinein gezeichnet werden.&lt;br /&gt;Zum Abschluss der komplette Quellcode, welcher eine Linie und einen String druckt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing.Printing;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt; : Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Print()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintDocument PrintDoc = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; PrintDocument();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&amp;gt; Printers = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; p &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; PrinterSettings.InstalledPrinters)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Printers.Add(p);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Alle verfügbaren Drucker sind in Printers gespeichert, man könnte den Benutzer daraus auswählen lassen.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// In diesem Beispiel wird einfach immer Drucker 0 gewählt.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintDoc.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[0];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintDoc.PrintPage += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; PrintPageEventHandler(PrintPage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintDoc.Print();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; PrintPage(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, PrintPageEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Graphics.DrawLine(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Pen(Color.Black), &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Point(0, 0), &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Point(100, 100));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Graphics.DrawString(&lt;span style="color:#A31414;"&gt;"Ich kann jetzt mit C# drucken"&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Font(&lt;span style="color:#A31414;"&gt;"Times New Roman"&lt;/span&gt;, 12), &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; SolidBrush(Color.Black), &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Point(45, 45));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4016237411608229482?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4016237411608229482/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2012/01/drucken-mit-c.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4016237411608229482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4016237411608229482'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2012/01/drucken-mit-c.html' title='Drucken mit C#'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-6394543937072855990</id><published>2012-01-05T01:19:00.002+01:00</published><updated>2012-01-05T01:23:49.808+01:00</updated><title type='text'>String mit Zeichen füllen</title><content type='html'>Es gibt einen netten kleinen Trick, mit dem man schnell einen String mit einem beliebigen Zeichen auffüllen kann.&lt;br /&gt;Die Klasse &lt;em&gt;string&lt;/em&gt; stellt nämlich den folgenden Konstruktor bereit:&lt;br /&gt;&lt;em&gt;new string(meinzeichen, anzahl)&lt;/em&gt;.&lt;br /&gt;Hierdurch wird ein neuer String bestehend aus &lt;em&gt;anzahl&lt;/em&gt; Zeichen mit dem Wert &lt;em&gt;meinzeichen&lt;/em&gt; angelegt.&lt;br /&gt;Folgendes Beispiel erzeugt einen String bestehend aus 30 Trennstrichen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; filled = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;('-', 30);&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-6394543937072855990?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/6394543937072855990/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2012/01/string-mit-zeichen-fullen.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6394543937072855990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6394543937072855990'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2012/01/string-mit-zeichen-fullen.html' title='String mit Zeichen füllen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-3403954410787459693</id><published>2011-12-30T22:53:00.005+01:00</published><updated>2011-12-30T22:58:38.321+01:00</updated><title type='text'>Ein gutes Jahr 2012!</title><content type='html'>Ich wünsche allen Lesern einen guten Rutsch und ein frohes neues Jahr 2012.&lt;br /&gt;In C# ausgedrückt:&lt;br /&gt;&lt;br /&gt;Form1.Designer.cs:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Erforderliche Designervariable.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.ComponentModel.IContainer components = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Verwendete Ressourcen bereinigen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="disposing"&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;override&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (disposing &amp;amp;&amp;amp; (components != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;components.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Vom Windows Form-Designer generierter Code&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Erforderliche Methode für die Designerunterstützung.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; InitializeComponent()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.components = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.ComponentModel.Container();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.timer1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Timer(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.components);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.SuspendLayout();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(12, 12);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Multiline = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Name = &lt;span style="color:#A31414;"&gt;"textBox1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.ReadOnly = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(374, 328);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.TabIndex = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// timer1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.timer1.Enabled = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.timer1.Interval = 300;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.timer1.Tick += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.EventHandler(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.timer1_Tick);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(433, 346);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Name = &lt;span style="color:#A31414;"&gt;"textBox2"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(12, 20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.TabIndex = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Form1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AutoScaleDimensions = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.SizeF(6F, 13F);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ClientSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(393, 349);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Name = &lt;span style="color:#A31414;"&gt;"Form1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Text = &lt;span style="color:#A31414;"&gt;"Grüße vom C# Blog"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Load += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.EventHandler(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Form1_Load);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ResumeLayout(&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.PerformLayout();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Timer timer1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Form1.cs:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt; : Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] images = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[22];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; init()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[0] = NewLine(23) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(60, ' ') + &lt;span style="color:#A31414;"&gt;"|"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 1; j &amp;lt; 14; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[j] = NewLine(23 - j) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(60, ' ') + &lt;span style="color:#A31414;"&gt;"|"&lt;/span&gt; + NewLine(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[j] += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(60, ' ') + &lt;span style="color:#A31414;"&gt;"|"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[14] = NewLine(9) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(60, ' ') + &lt;span style="color:#A31414;"&gt;"."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[15] = NewLine(8) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(58, ' ') + &lt;span style="color:#A31414;"&gt;"....."&lt;/span&gt; + NewLine(1) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(58, ' ') + &lt;span style="color:#A31414;"&gt;"....."&lt;/span&gt; + NewLine(1) + &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(58, ' ') + &lt;span style="color:#A31414;"&gt;"....."&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[16] = Explode(7, 54, 7);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[17] = Explode(9, 52, 5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[18] = Explode(11, 50, 3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[19] = Explode(13, 48, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[20] = Explode(7, 54, 7);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;images[21] = &lt;span style="color:#A31414;"&gt;"Frohes Neues!"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Explode(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; size, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; left, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; height)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; result = &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += NewLine(height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(left + 2 + (size - 5) + 1, ' ') + &lt;span style="color:#A31414;"&gt;"|"&lt;/span&gt; + NewLine(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 5; j &amp;lt;= size; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(left + 2 + (size - 5) + 1 - (j - 4) - 1, ' ');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; z = 0; z &amp;lt; 5&amp;nbsp;&amp;nbsp;+ (j - 5) * 2; z++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;"."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += NewLine(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(left, ' ') + &lt;span style="color:#A31414;"&gt;"-"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt;= 5 + (size - 5) * 2; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;"."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;"-"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += NewLine(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = size; j &amp;gt;= 5; j--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(left + 2 + (size - 5) + 1 - (j - 4) - 1, ' ');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; z = 0; z &amp;lt; 5 + (j - 5) * 2; z++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;"."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += NewLine(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;.PadLeft(left + 2 + (size - 5) + 1, ' ') + &lt;span style="color:#A31414;"&gt;"|"&lt;/span&gt; + NewLine(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; NewLine(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; nr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; result = &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; nr; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += Environment.NewLine;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; timer1_Tick(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (i &amp;lt; images.Length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox2.Focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox1.Text = images[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;(mein grafisches Vorstellungsvermögen ist nicht sehr gut)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-3403954410787459693?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/3403954410787459693/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/12/ein-gutes-jahr-2012.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3403954410787459693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3403954410787459693'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/12/ein-gutes-jahr-2012.html' title='Ein gutes Jahr 2012!'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-7411447034817130527</id><published>2011-12-16T17:26:00.001+01:00</published><updated>2011-12-16T17:26:37.381+01:00</updated><title type='text'>Danke</title><content type='html'>Wie aufmerksame wie unaufmerksame Leser sicherlich schon bemerkt haben, erscheinen leider seit längerem keine Posts mehr von mir und auch die Antworten auf eure Kommentare dauern leider sehr lange, da ich ziemlich viel zu tun habe im Moment.&lt;br /&gt;&lt;br /&gt;Ich versuche jedoch, wenigstens die Kommentare so gut ich kann zu beantworten und freue mich auch definitiv über jeden Eintrag und jedes Interesse an diesem Blog.&lt;br /&gt;&lt;br /&gt;Dafür möchte ich mich hier herzlich bei allen Lesern bedanken, ich hoffe dieser Blog hilft ein wenig und bereitet ein bisschen Freude beim Lesen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-7411447034817130527?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/7411447034817130527/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/12/danke.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7411447034817130527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7411447034817130527'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/12/danke.html' title='Danke'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-448201463980609335</id><published>2011-07-01T19:17:00.004+02:00</published><updated>2011-08-07T12:00:07.292+02:00</updated><title type='text'>Maus steuern</title><content type='html'>Auf User Anfragen erscheint heute ein Post zum Thema, wie man mit C# die Maus steuern kann, sie also komplett auf dem ganzen Bildschirm bewegen und z.B. Klicks simulieren kann.&lt;br /&gt;Ich habe schon einen Post zum &lt;a href="http://csharp-tricks.blogspot.com/2010/05/tastendruck-simulieren.html"&gt;Simulieren von Tastendrücken&lt;/a&gt; geschrieben, welches ganz einfach mit der Funktion &lt;span style="font-style:italic;"&gt;SendKeys()&lt;/span&gt; umgesetzt werden kann.&lt;br /&gt;Die Maus zu steuern ist nicht mehr ganz so einfach, es gibt (noch) keine eingebaute .Net Funktion, wir müssen auf nicht verwaltete System Funktionen zurückgreifen.&lt;br /&gt;Kernstück ist die &lt;span style="font-style:italic;"&gt;P/Invoke&lt;/span&gt; Funktion &lt;span style="font-style:italic;"&gt;SendInput()&lt;/span&gt;. Mit dieser Funktion können verschiedene Kommandos an den ausführenden Computer gesendet werden, zum Beispiel direkte Hardwareeingaben, Tastatur- und eben Mausereignisse (im folgenden &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt; genannt).&lt;br /&gt;Die Funktion erwartet 3 Parameter: Der 1. beschreibt die Anzahl der übergebenen &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt;, der 2. enthält eine Referenz auf die tatsächlichen Inputdaten, der 3. speichert die Größe eines einzelnen &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt;.&lt;br /&gt;Den 2. Parameter muss vom Typ einer Struktur sein, welche mindestens den Typ des &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt; (also Hardware, Tastatur, Maus ...) sowie die Daten des &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt; enthält.&lt;br /&gt;Die Struktur habe ich &lt;span style="font-style:italic;"&gt;Input&lt;/span&gt; genannt.&lt;br /&gt;Mausinputdaten selber haben mehrere Daten, wie die X - und Y - Koordinate, welche ich in der Struktur &lt;span style="font-style:italic;"&gt;MouseInput&lt;/span&gt; zusammengefasst habe.&lt;br /&gt;&lt;br /&gt;Zuerst möchte ich nun das Bewegen der Maus beschreiben: Wir brauchen also eine Instanz der Struktur &lt;span style="font-style:italic;"&gt;Input&lt;/span&gt; mit den gewünschten Zielmauskoordinaten.&lt;br /&gt;Als Typ des &lt;span style="font-style:italic;"&gt;Inputs&lt;/span&gt; setzen wir 0, welches ein Mausereignis symbolisiert.&lt;br /&gt;Die Mausdaten repräsentiert durch eine Instanz von &lt;span style="font-style:italic;"&gt;MouseInput&lt;/span&gt; lassen wir uns über die Funktion &lt;span style="font-style:italic;"&gt;CreateMouseInput()&lt;/span&gt; erstellen.&lt;br /&gt;Diese erhält alle benötigten Parameter und setzt diese im zurückgegeben Mausereignis.&lt;br /&gt;Zum Bewegen der Maus sind nur die Werte für X und Y wichtig (Zielkoordinaten) sowie für &lt;span style="font-style:italic;"&gt;DwFlags&lt;/span&gt;. Dieses Feld kann bestimmte Flags aufnehmen, wie zum Beispiel den Druck eines Mausbuttons.&lt;br /&gt;In diesem Fall übergeben wir aber 2 vorher definierte Konstanten (so haben wir leicht zu merkende Namen anstatt Zahlen), &lt;span style="font-style:italic;"&gt;MOUSEEVENTF_ABSOLUTE&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;MOUSEEVENTF_MOVE&lt;/span&gt;, um anzuzeigen, dass wir die Maus bewegen wollen. Erstere sagt aus, dass wir ein Mausereignis nicht nur im aktuellen Fenster herbeiführen wollen, sondern auf dem ganzen Bildschirm, zweite zeigt die gewünschte Bewegung der Maus an.&lt;br /&gt;&lt;br /&gt;Das Simulieren eines (Links-)Klicks funktioniert ähnlich.&lt;br /&gt;Wir müssen wieder einen &lt;span style="font-style:italic;"&gt;Input&lt;/span&gt; mit den entsprechenden Daten erstellen, verwenden diesmal aber ein Array der Länge 2, da wir zuerst das Drücken der linken Maustaste und anschließend das Loslassen dieser simulieren wollen.&lt;br /&gt;Über die Funktion &lt;span style="font-style:italic;"&gt;CreateMouseInput()&lt;/span&gt; lassen wir uns dafür 2 &lt;span style="font-style:italic;"&gt;MouseInputs&lt;/span&gt; erstellen und übergeben für den Wert von &lt;span style="font-style:italic;"&gt;DwFlags&lt;/span&gt; die entsprechenden Konstanten.&lt;br /&gt;&lt;br /&gt;Ich hoffe, diese kurze Erläuterung sowie der folgende Code helfen:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt; : Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// P/Invoke Funktion u.a. zum Steuern der Maus &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#A31414;"&gt;"user32.dll"&lt;/span&gt;, SetLastError = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;extern&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; SendInput(&lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; nInputs, Input[] pInputs, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; cbSize);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Struktur für Mausdaten&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;struct&lt;/span&gt; MouseInput&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; X; &lt;span style="color:#008000;"&gt;// X - Koordinate&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; Y; &lt;span style="color:#008000;"&gt;// Y - Koordinate&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; MouseData; &lt;span style="color:#008000;"&gt;// Mausdaten, z.B. für Mausrad&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; DwFlags; &lt;span style="color:#008000;"&gt;// weitere Mausdaten, z.B. für Mausbuttons&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; Time; &lt;span style="color:#008000;"&gt;// Zeit des Events&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; IntPtr DwExtraInfo; &lt;span style="color:#008000;"&gt;// weitere Informationen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Oberstruktur für InputDaten der Funktion SendInput&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;struct&lt;/span&gt; Input { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; Type; &lt;span style="color:#008000;"&gt;// Typ des Inputs, 0 für Maus&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; MouseInput Data; &lt;span style="color:#008000;"&gt;// Mausdaten&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Konstanten für Mausflags&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; MOUSEEVENTF_LEFTDOWN = 0x0002; &lt;span style="color:#008000;"&gt;// linken Mausbutton drücken&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; MOUSEEVENTF_LEFTUP = 0x0004; &lt;span style="color:#008000;"&gt;// linken Mausbutton loslassen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; MOUSEEVENTF_ABSOLUTE = 0x8000; &lt;span style="color:#008000;"&gt;// ganzen Bildschirm ansprechen, nicht nur aktuelles Fenster&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; MOUSEEVENTF_MOVE = 0x0001; &lt;span style="color:#008000;"&gt;// Maus bewegen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; MouseInput CreateMouseInput(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; x, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; y, &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; data, &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; time, &lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt; flag)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// aus gegebenen Daten Objekt vom Typ MouseInput erstellen, welches dann gesendet werden kann&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseInput Result = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MouseInput();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.X = x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Y = y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.MouseData = data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Time = time;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.DwFlags = flag;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; SimulateMouseClick() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Linksklick simulieren: Maustaste drücken und loslassen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input[] MouseEvent = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Input[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[0].Type = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[0].Data = CreateMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTDOWN);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[1].Type = 0; &lt;span style="color:#008000;"&gt;// INPUT_MOUSE; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[1].Data = CreateMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTUP); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendInput((&lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt;)MouseEvent.Length, MouseEvent, Marshal.SizeOf(MouseEvent[0].GetType())); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; SimulateMouseMove(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; x, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; y) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input[] MouseEvent = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Input[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[0].Type = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Maus bewegen: Flags ABSOLUTE (ganzen Bildschirm verfügbar machen) und MOVE (bewegen)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseEvent[0].Data = CreateMouseInput(x, y, 0, 0, MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendInput((&lt;span style="color:#0000FF;"&gt;uint&lt;/span&gt;)MouseEvent.Length, MouseEvent, Marshal.SizeOf(MouseEvent[0].GetType())); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Maus testweise bewegen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimulateMouseMove(0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// und anschließend klicken&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimulateMouseClick();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-448201463980609335?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/448201463980609335/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/07/maus-steuern.html#comment-form' title='9 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/448201463980609335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/448201463980609335'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/07/maus-steuern.html' title='Maus steuern'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-3164291238474298251</id><published>2011-05-14T14:32:00.002+02:00</published><updated>2011-05-14T14:51:06.696+02:00</updated><title type='text'>Quine Wettbewerb: Finde das kürzeste</title><content type='html'>Anlässlich des 150. Posts habe ich mir wieder einen kleinen "Wettbewerb" ausgedacht.&lt;br /&gt;Ziel ist es, ein möglichst kurzes Quine zu schreiben, welches eine bestimmte Anweisung ausführt.&lt;br /&gt;Zur Erinnerung: Ein Quine ist ein Programm, welches seinen eigenen Quellcode komplett ausgibt, auf diesem Blog gibt es auch einen &lt;a href="http://csharp-tricks.blogspot.com/2010/11/ein-quine-mit-c.html"&gt;Post&lt;/a&gt; darüber.&lt;br /&gt;Aufgabe ist es nun, aus folgendem Programm ein Quine zu machen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Quine&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Diagnostics.Process.Start(System.Environment.SystemDirectory + &lt;span style="color:#A31414;"&gt;"\\shutdown.exe"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"-s -t 120"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Der Wettbewerb soll über 3 Wochen laufen, also bis Samstag den 4.5. Wer bis dahin den kürzesten Code gepostet hat, gewinnt ;-)&lt;br /&gt;Ich lege vor.&lt;br /&gt;Das Quine soll natürlich exakt den Programmcode drucken, hierbei sind Zeileneinrückungen aber nicht wichtig.&lt;br /&gt;Ein kleiner Tipp, wie man die Ausgabe leicht überprüfen kann:&lt;br /&gt;Mit &lt;span style="font-style:italic;"&gt;Console.SetOut(&lt;/span&gt;) lässt sich die Ausgabe der Konsole in einen Stream umleiten, so kann z.B. in eine Datei geschrieben werden, also einfach die entsprechenden Befehle in das Programm schreiben (sie zählen nicht zum Quine dazu).&lt;br /&gt;Mit Programmen wie Beyond Compare kann dann die Gleichheit überprüft werden (also definiere, alles was Beyond Compare als gleich ansieht gilt) und mit z.B. Word kann leicht die Länge der Datei gezählt werden.&lt;br /&gt;Mein Quine Code lautet:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Quine&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Zählt nicht dazu, auskommentieren um Ausgabe umzuleiten: System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\Users\User\Desktop\Neues Textdokument (2).txt");&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// ", System.Console.SetOut(sw);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Diagnostics.Process.Start(System.Environment.SystemDirectory + &lt;span style="color:#A31414;"&gt;"\\shutdown.exe"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"-s -t 120"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; s = &lt;span style="color:#A31414;"&gt;"class Quine {3} {0} {3} static void Main(string[] args) {3} {0} {3} System.Diagnostics.Process.Start(System.Environment.SystemDirectory + {2}{5}{5}shutdown.exe{2}, {2}-s -t 120{2}); {3} string s = {2}{1}{2}; {3} System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125), System.Convert.ToChar(92)); {3} {4} {3} {4}"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125), System.Convert.ToChar(92));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// ", sw.Close();&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Die Länge hiervon beträgt 763 Zeichen.&lt;br /&gt;&lt;br /&gt;Und jetzt, viel Glück und viel Spaß.&lt;br /&gt;&lt;br /&gt;PS: Speichert vorher alle Dokumente bzw. schaut euch an, wie man das Herunterfahren von Windows abbrechen kann (Stichwort: shutdown -a).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-3164291238474298251?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/3164291238474298251/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/quine-wettbewerb-finde-das-kurzeste.html#comment-form' title='6 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3164291238474298251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3164291238474298251'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/quine-wettbewerb-finde-das-kurzeste.html' title='Quine Wettbewerb: Finde das kürzeste'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-6269804614244364251</id><published>2011-05-07T11:52:00.005+02:00</published><updated>2011-05-07T12:16:28.563+02:00</updated><title type='text'>Anwendung mit Administratorrechten neu starten (Windows Vista / 7)</title><content type='html'>In einem älteren Post habe ich gezeigt, wie man mit C# eine Anwendung mit &lt;a href="http://csharp-tricks.blogspot.com/2010/05/c-anwendung-mit-administratorrechten.html"&gt;Administratorechten ausstatten und starten&lt;/a&gt; kann.&lt;br /&gt;Hierfür wurde jedoch eine eigene Datei, die Anwendungsmanifestdatei, benötigt.&lt;br /&gt;Auf Anfrage eines Lesers möchte ich heute einen kleinen Trick vorstellen, wie man eine Anwendung nur durch reinen Code mit diesen Rechten ausstattet.&lt;br /&gt;Entscheidend ist hierbei die Klasse &lt;em&gt;System.Diagnostics&lt;/em&gt;, welche einen beliebigen Process mit bestimmten Argumenten starten kann.&lt;br /&gt;Wenn die Anwendung also normal gestartet wird, wird sie über diese Klasse mit Administratorrechten neugestartet.&lt;br /&gt;Damit das Programm nicht unendlich oft aufgerufen wird, geben wir dem Programm zur Prüfung beim Aufrufen ein neues Befehlszeilenargument mit.&lt;br /&gt;Der folgende Code sollte das Beispiel erläutern:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] CommandLineArgs = Environment.GetCommandLineArgs(); &lt;span style="color:#008000;"&gt;// Befehlszeilenargumente auslesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (CommandLineArgs.Length &amp;lt;= 1 || CommandLineArgs[1] != &lt;span style="color:#A31414;"&gt;"restarted"&lt;/span&gt;) &lt;span style="color:#008000;"&gt;// ist das 2. Argument (das 1. ist immer der Dateipfad) != restarted, wurde das Programm noch nicht neugestartet&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProcessStartInfo ProcessInfo = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ProcessStartInfo(Application.ExecutablePath, &lt;span style="color:#A31414;"&gt;"restarted"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// Prozessinformationen festlegen, Anwendungspfad und unser eigenes Argument "restarted"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProcessInfo.Verb = &lt;span style="color:#A31414;"&gt;"runas"&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// Befehl zum Ausführen als Administrator&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Process.Start(ProcessInfo); &lt;span style="color:#008000;"&gt;// Prozess mit den eingestellten Informationen starten&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Environment.Exit(0); &lt;span style="color:#008000;"&gt;// wurde das Argument "restarted" übergeben, wurde das Programm bereits gestartet, um die Endlosrekursion zu verhindern, nicht erneut aufrufen&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-6269804614244364251?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/6269804614244364251/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/anwendung-mit-administratorrechten-neu.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6269804614244364251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6269804614244364251'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/anwendung-mit-administratorrechten-neu.html' title='Anwendung mit Administratorrechten neu starten (Windows Vista / 7)'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4718096215623980290</id><published>2011-05-06T22:47:00.004+02:00</published><updated>2011-05-06T23:37:47.489+02:00</updated><title type='text'>Befehlszeilenargumente auslesen</title><content type='html'>Programme können unter Windows grundsätzlich mit verschiedenen Argumenten aufgerufen werden, welche Befehlszeilenargumente heißen.&lt;br /&gt;Zum Beispiel können einige Programme direkt mit zu öffnenden Dateien als Argument aufgerufen werden.&lt;br /&gt;In Konsolenanwendungen in C# stehen diese Kommandozeilenargumente direkt als Parameter der Funktion &lt;em&gt;Main()&lt;/em&gt; zur Verfügung.&lt;br /&gt;In Windows Forms-Anwendungen stehen diese so nicht bereit, dafür gibt es aber die Funktion &lt;em&gt;Environment.GetCommandLineArgs()&lt;/em&gt;, welche die Befehlszeilenargumente als Array vom Typ String zurückgibt.&lt;br /&gt;Folgender Code liest die übergebenen Parameter beim Programmstart aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] CommandLineArgs = Environment.GetCommandLineArgs();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Wie man sieht, wird als 1. Parameter immer der Pfad und der Name des ausgeführten Programmes übergeben.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4718096215623980290?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4718096215623980290/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/befehlszeilenargumente-auslesen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4718096215623980290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4718096215623980290'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/05/befehlszeilenargumente-auslesen.html' title='Befehlszeilenargumente auslesen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5355066144859406604</id><published>2011-04-01T14:51:00.009+02:00</published><updated>2011-04-02T14:39:24.000+02:00</updated><title type='text'>Windows 7 Features: Eine JumpList erstellen</title><content type='html'>Die &lt;em&gt;JumpList&lt;/em&gt; bezeichnet unter Windows 7 das Kontextmenü einer Anwendung in der Taskleiste, welches durch Rechtsklick auf das Applikationssymbol sichtbar wird.&lt;br /&gt;In diesem Menü befinden sich z.B. häufig geöffnete Dateien der Anwendung und mögliche Programmoptionen.&lt;br /&gt;Für das C# Studio sieht meine &lt;em&gt;JumpList&lt;/em&gt; beispielsweise so aus: &lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-RMtEQKy-xsc/TZXOEh07tsI/AAAAAAAAADk/fbjSET3aXkM/s1600/JumpList.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://1.bp.blogspot.com/-RMtEQKy-xsc/TZXOEh07tsI/AAAAAAAAADk/fbjSET3aXkM/s320/JumpList.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5590601089645524674" /&gt;&lt;/a&gt;&lt;br /&gt;In C# können wir nun für unsere eigenen Anwendungen &lt;em&gt;JumpLists&lt;/em&gt; erstellen und bearbeiten.&lt;br /&gt;Obwohl es im Umfang des .Net Frameworks schon eine &lt;em&gt;JumpList&lt;/em&gt; Klasse gibt, brauchen wir für &lt;em&gt;Windows Forms&lt;/em&gt; Anwendungen doch das &lt;em&gt;Windows API Code Pack&lt;/em&gt;, denn die vorhandene Klasse ist nur für WPF Anwendungen geeignet.&lt;br /&gt;Die Installation des Windows API Code Packs habe ich &lt;a href="http://csharp-tricks.blogspot.com/2010/08/windows-api-code-pack-einbinden.html"&gt;hier&lt;/a&gt; beschrieben, die 2 entstandenen dll - Dateien müssen anschließend noch eingebunden werden (Projekt - Verweis hinzufügen - Durchsuchen). Die benötigten Dateien heißen "Microsoft.WindowsAPICodePack.dll" und "Microsoft.WindowsAPICodePack.Shell.dll", sie befinden sich im Installationsordner des Code Packs unter Shell\bin\Debug.&lt;br /&gt;Die für diesen Post verwendete Klasse &lt;em&gt;JumpList&lt;/em&gt; befindet sich schließlich in der Klasse &lt;em&gt;Microsoft.WindowsAPICodePack.Taskbar&lt;/em&gt;.&lt;br /&gt;In einer &lt;em&gt;JumpList&lt;/em&gt; sind standardmäßig 2 Kategorien vorhanden: "Aufgaben" und "Häufig" (geöffnete Dateien).&lt;br /&gt;Diesen Kategorien können wir durch die Funktionen &lt;em&gt;AddUserTasks()&lt;/em&gt; bzw. &lt;em&gt;AddToRecent()&lt;/em&gt; Einträge hinzufügen.&lt;br /&gt;Als Einträge verwende ich in diesem Post Objekte der Klasse &lt;em&gt;JumpListLink&lt;/em&gt;, welche einen Namen und ein Ziel erhalten, welches ein ausführbares Programm oder eine Datei sein kann.&lt;br /&gt;Die Kategorie "Recent" lässt sich allerdings nicht so einfach befüllen, denn Windows lässt nur Dateien mit einer Endung zu, die für das entsprechende Programm registriert sind.&lt;br /&gt;Mit einem kleinen Trick kann man sich allerdings die Schwierigkeit der Registrierung umgehen, es gibt nämlich die Möglichkeit, in den &lt;em&gt;JumpLists&lt;/em&gt; eigene Kategorien anzulegen - legt man dann z.B. die Kategorie "Häufig" an, ist das Ergebnis das gleiche.&lt;br /&gt;Der Beispielcode legt in der &lt;em&gt;JumpList&lt;/em&gt; des Programms 2 Einträge unter "Aufgaben" an - einen Eintrag zu Paint und einen zum Windows Taschenrechner.&lt;br /&gt;Für diese Programme werden ebenfalls Icons bereitgestellt, welche als &lt;em&gt;IconReference&lt;/em&gt; direkt aus den Originalprogrammen referenziert werden.&lt;br /&gt;Weiterhin legt der Code eine neue Kategorie an und erstellt in dieser einen Link zu einer Datei auf meinem Desktop.&lt;br /&gt;Das anschließende &lt;em&gt;Refresh()&lt;/em&gt; ist wichtig, damit die Änderungen übernommen werden.&lt;br /&gt;Die &lt;em&gt;JumpList&lt;/em&gt; des Programms ist auch beim nächsten Programmstart - sofern sie nicht gelöscht bzw. geändert wurde - noch in der gleichen Form erhalten!&lt;br /&gt;Das Ergebnis sieht so aus:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-uSSCg4_aJqE/TZcXHlPUocI/AAAAAAAAADs/qYG_PimaNCM/s1600/jumpnew.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 303px; height: 231px;" src="http://4.bp.blogspot.com/-uSSCg4_aJqE/TZcXHlPUocI/AAAAAAAAADs/qYG_PimaNCM/s320/jumpnew.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5590962881426661826" /&gt;&lt;/a&gt;&lt;br /&gt;Jetzt nun der Code, am Anfang ist ein &lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; Microsoft.WindowsAPICodePack.Taskbar; &lt;br /&gt;erforderlich:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JumpList CustomJumpList = JumpList.CreateJumpList(); &lt;span style="color:#008000;"&gt;// neue JumpListe erzeugen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Link zu Paint unter Aufgaben hinzufügen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JumpListLink EntryPaint = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; JumpListLink(&lt;span style="color:#A31414;"&gt;@"C:\Windows\System32\mspaint.exe"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"Paint"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EntryPaint.IconReference = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Microsoft.WindowsAPICodePack.Shell.IconReference(&lt;span style="color:#A31414;"&gt;@"C:\Windows\System32\mspaint.exe"&lt;/span&gt;, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomJumpList.AddUserTasks(EntryPaint);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Link zum Taschenrechner unter Aufgaben hinzufügen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JumpListLink EntryCalc = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; JumpListLink(&lt;span style="color:#A31414;"&gt;@"C:\Windows\System32\calc.exe"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"Rechner"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EntryCalc.IconReference = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Microsoft.WindowsAPICodePack.Shell.IconReference(&lt;span style="color:#A31414;"&gt;@"C:\Windows\System32\calc.exe"&lt;/span&gt;, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomJumpList.AddUserTasks(EntryCalc);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// eigene Kategorie anlegen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JumpListCustomCategory CustomCategory = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; JumpListCustomCategory(&lt;span style="color:#A31414;"&gt;"Neue Kategorie"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// in diese Link zu einer Datei anlegen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomCategory.AddJumpListItems(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; JumpListLink(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\C#.txt"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"C# Links"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomJumpList.AddCustomCategories(CustomCategory);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Änderungen übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomJumpList.Refresh();&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5355066144859406604?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5355066144859406604/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/04/windows-7-features-eine-jumplist.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5355066144859406604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5355066144859406604'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/04/windows-7-features-eine-jumplist.html' title='Windows 7 Features: Eine JumpList erstellen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RMtEQKy-xsc/TZXOEh07tsI/AAAAAAAAADk/fbjSET3aXkM/s72-c/JumpList.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-3220487335827063787</id><published>2011-03-23T08:00:00.002+01:00</published><updated>2011-04-02T14:54:47.537+02:00</updated><title type='text'>Spracherkennung Part 2: Command Mode</title><content type='html'>Wie angekündigt, ist dieser Post eine Fortsetzung des &lt;a href="http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-1-dictation-mode.html"&gt;vorigen&lt;/a&gt;, es geht um Spracherkennung, insbesondere um den &lt;em&gt;Command Mode&lt;/em&gt;.&lt;br /&gt;Wie der Name schon andeutet, wird aufgenommene Sprache damit auf vordefinierte Befehle untersucht.&lt;br /&gt;Man könnte natürlich auch über den im vorigen Post beschriebenen &lt;em&gt;Dictation Mode&lt;/em&gt; einen Text aufnehmen und diesen auf bestimmte Begriffe hin untersuchen - der &lt;em&gt;Command Mode&lt;/em&gt; bietet dafür allerdings ein paar Vorteile.&lt;br /&gt;Denn einerseits ermöglicht er leicht eine dauerhafte Prüfung, ob Befehle gesagt wurden, und andererseits ist die Erkennung besser, da das Programm nur die Befehlswörter kennt und sich bei der Erkennung nur zwischen diesen entscheiden muss.&lt;br /&gt;Nun direkt zum Code: Die Vorraussetzungen (das Einbinden der Ressource etc.) sind die gleichen wie im vorigen Post.&lt;br /&gt;Zum Erkennen der Befehle benutzen wir jetzt allerdings eine Instanz der Klasse &lt;em&gt;SpeechRecognizer&lt;/em&gt;.&lt;br /&gt;Diese erwartet auch eine Grammatik, welche wir aber jetzt manuell mit Wörtern befüllen, die erkannt werden sollen.&lt;br /&gt;Über die Eigenschaft &lt;em&gt;Enabled&lt;/em&gt; kann die Spracherkennung aktiviert werden.&lt;br /&gt;Beim Erkennen von Befehlen tritt das Ereignis &lt;em&gt;SpeechRecognized&lt;/em&gt; auf, diesem weisen wir eine Funktion zu, welche das Ereignis behandeln soll.&lt;br /&gt;Wird ein &lt;em&gt;SpeechRecognizer&lt;/em&gt; initialisiert, öffnet sich unter Windows ein Fenster zur Spracherkennung - hier muss der Benutzer auf den großen Mikrofonknopf drücken, um die Erkennung zu starten.&lt;br /&gt;Das Drücken des Knopfes hat nichts mit der Eigenschaft Enabled zu tun - beide Dinge müssen aktiviert sein.&lt;br /&gt;Einen Weg, die Spracherkennung nur per Code zu starten und das Fenster zu verstecken habe ich nicht gefunden. Mich würde aber interessieren ob das möglich ist, falls jemand eine Idee hat, bitte kommentieren!&lt;br /&gt;Der Code:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StartListening()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SpeechRecognizer SR = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; SpeechRecognizer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Befehle registrieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Choices Commands = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Choices();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Commands.Add(&lt;span style="color:#A31414;"&gt;"Stop"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Commands.Add(&lt;span style="color:#A31414;"&gt;"Los"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrammarBuilder GB = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GrammarBuilder(Commands); &lt;span style="color:#008000;"&gt;// die Befehle mit einem GrammerBuilder laden&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Grammar CommandGrammar = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Grammar(GB); &lt;span style="color:#008000;"&gt;// eine Grammatik über den GrammarBuilder erstellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SR.LoadGrammar(CommandGrammar); &lt;span style="color:#008000;"&gt;// die Grammatik laden&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SR.SpeechRecognized += CommandRecognized; &lt;span style="color:#008000;"&gt;// Funktion zur Behandlung des Ereignisses&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SR.Enabled = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; CommandRecognized(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SpeechRecognizedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Command = e.Result.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// hier weiterer Verarbeitungscode ...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-3220487335827063787?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/3220487335827063787/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-2-command-mode.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3220487335827063787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3220487335827063787'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-2-command-mode.html' title='Spracherkennung Part 2: Command Mode'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-6461687583671417057</id><published>2011-03-22T08:00:00.003+01:00</published><updated>2011-04-02T14:55:39.187+02:00</updated><title type='text'>Spracherkennung Part 1: Dictation Mode</title><content type='html'>Im vorigen Post ging es um die &lt;a href="http://csharp-tricks.blogspot.com/2011/03/sprachausgabe-mit-c.html"&gt;Sprachausgabe mit .Net&lt;/a&gt;, dieses Mal widmen wir uns der Umkehrung, nämlich der Spracherkennung.&lt;br /&gt;Diese ist für Computer viel schwieriger als die Ausgabe, das .Net Framework bietet über die Klasse &lt;em&gt;System.Speech.Recognition&lt;/em&gt; allerdings wieder fertige Funktionen an, die mit wenig Codeaufwand zur Spracherkennung eingesetzt werden können.&lt;br /&gt;Generell gibt es 2 Modi, in welchen die Spracherkennung betrieben werden kann: In diesem Post geht es um den &lt;em&gt;Dictation Mode&lt;/em&gt;, im &lt;a href="http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-2-command-mode.html"&gt;nächsten&lt;/a&gt; um den &lt;em&gt;Command Mode&lt;/em&gt;.&lt;br /&gt;Der &lt;em&gt;Dictation Mode&lt;/em&gt; eignet sich, wie der Name schon sagt, zum Diktieren von Texten.&lt;br /&gt;Der aufgezeichnete Ton wird wie ein Diktat verstanden und das Programm versucht, die gesprochenen Wörter zu erkennen.&lt;br /&gt;Wie bei der Sprachausgabe muss zuerst ein Verweis auf die Komponente &lt;em&gt;System.Speech&lt;/em&gt; eingebunden werden.&lt;br /&gt;Die benötigte Unterklasse heißt nun allerdings &lt;em&gt;Recognition&lt;/em&gt;, und so benutzen wir am Anfang folgende using - Direktive:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Speech.Recognition;&lt;/blockquote&gt;&lt;br /&gt;Zur Spracherkennung benutzen wir eine Instanz der Klasse &lt;span style="font-style:italic;"&gt;SpeechRecognitionEngine&lt;/span&gt;.&lt;br /&gt;Diese benötigt eine Grammatik, also eine Art Anweisungssammlung, wie die Sprache interpretiert werden soll.&lt;br /&gt;Als Grammatik übergeben wir der &lt;em&gt;SpeechRecognitionEngine&lt;/em&gt; eine Instanz der Klasse &lt;em&gt;DictationGrammar&lt;/em&gt;, um anzuzeigen, dass wir den Diktiermodus benutzen wollen.&lt;br /&gt;Das Erkennen von gesprochenen Wörtern geschieht nun mit Aufruf der Funktion &lt;em&gt;Recognize()&lt;/em&gt;. Diese setzt die Spracherkennung in Bereitschaftsmodus und beginnt, wenn das Mikrofon Töne vernimmt. &lt;br /&gt;Macht der Sprecher eine bestimmte Zeit Pause (einstellbar), wird die Spracherkennung beendet und das Programm versucht nun, den Ton als Wörter zu interpretieren (eine asynchrone Aufnahme ist auch möglich).&lt;br /&gt;Zum Schluss wird das Diktierergebnis zurückgegeben.&lt;br /&gt;Hier der Code:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SpeechRecognitionEngine SRE = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; SpeechRecognitionEngine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SRE.LoadGrammar(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; DictationGrammar()); &lt;span style="color:#008000;"&gt;// Diktiergrammatik laden&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SRE.SetInputToDefaultAudioDevice(); &lt;span style="color:#008000;"&gt;// Aufnahmequelle auf Standard setzen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecognitionResult Result = SRE.Recognize(); &lt;span style="color:#008000;"&gt;// Ton aufzeichnen und erkennen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ResultString = &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// alle erkannten Wörter aus dem Ergebnis dem Ergebnisstring hinzufügen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (RecognizedWordUnit w &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; Result.Words)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResultString += w.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-6461687583671417057?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/6461687583671417057/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-1-dictation-mode.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6461687583671417057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6461687583671417057'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/spracherkennung-part-1-dictation-mode.html' title='Spracherkennung Part 1: Dictation Mode'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4111825273113099967</id><published>2011-03-21T08:00:00.000+01:00</published><updated>2011-03-21T08:00:19.577+01:00</updated><title type='text'>Sprachausgabe mit C#</title><content type='html'>Die Überschrift hört sich wahrscheinlich ziemlich kompliziert an, allerdings ist in C# die Realisierung einer Sprachausgabe in nur 2 Zeilen möglich!&lt;br /&gt;Denn die schon mit Windows mitgelieferte Sprachsynthese ist auch im .Net Framework nutzbar, die benötigte Komponente ist die Klasse &lt;span style="font-style:italic;"&gt;System.Speech.Synthesis&lt;/span&gt;. Um sie nutzen zu können, muss sie zuerst eingebunden werden: &lt;span style="font-style:italic;"&gt;Projekt - Verweis hinzufügen - (Reiter .Net) System.Speech&lt;/span&gt;.&lt;br /&gt;Um den Code zu vereinfachen, binden wir die Klasse mittels &lt;span style="font-style:italic;"&gt;using&lt;/span&gt; ein:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Speech.Synthesis;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Zur Sprachausgabe benötigen wir eine Instanz der Klasse &lt;span style="font-style:italic;"&gt;SpeechSynthesizer&lt;/span&gt;, welcher über die Funktion &lt;span style="font-style:italic;"&gt;Speak()&lt;/span&gt; der auszugebende Text übergeben werden kann.&lt;br /&gt;Natürlich gibt es aber noch viele weitere Eigenschaften, mit denen herumexperimentiert werden darf.&lt;br /&gt;Ein paar in der Übersicht:&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;Rate&lt;/span&gt;: Wertebereich von -10 bis 10, Geschwindigkeit der Textausgabe&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;Volume&lt;/span&gt;: Wertebereich 0 - 100, Lautstärke&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;Voice&lt;/span&gt;: Stimme&lt;br /&gt;Die letzte Eigenschaft ist schreibtgeschützt, ihr kann direkt nichts zugewiesen werden, sie kann allerdings über Funktionen geändert werden.&lt;br /&gt;Nützlich ist die Funktion &lt;em&gt;SelectVoiceByHints()&lt;/em&gt;, über die "Hinweise" gegeben werden können, nach denen eine passende Stimme gesucht werden soll.&lt;br /&gt;Solche Kriterien sind zum Beispiel Geschlecht, Alter und sogar Kulturkreis.&lt;br /&gt;So sucht zum Beispiel folgende Anweisung nach einem Stimmtyp, welcher weiblich und erwachsen klingt und legt diese Stimme bei Erfolg als Ausgabestimme fest:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Speaker.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Allerdings wird auf vielen Windows Rechnern nur eine Stimme vorinstalliert sein (bei mir z.B. nur "Microsoft Anna").&lt;br /&gt;Dann hat eine Stimmsuche keinerlei Auswirkung.&lt;br /&gt;Die installierten Stimmen kann man über die Funktion &lt;em&gt;Speaker.GetInstalledVoices()&lt;/em&gt; auslesen.&lt;br /&gt;Die einzelnen Stimmen liegen als Objekt vom Typ &lt;em&gt;Voice&lt;/em&gt; vor, folgendes Beispiel liest alle Stimmen aus und fügt ihren Namen zu der Liste &lt;em&gt;InstalledVoices&lt;/em&gt; hinzu:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;List&amp;lt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&amp;gt; InstalledVoices = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (InstalledVoice voice &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; Speaker.GetInstalledVoices())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InstalledVoices.Add(voice.VoiceInfo.Name);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4111825273113099967?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4111825273113099967/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/sprachausgabe-mit-c.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4111825273113099967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4111825273113099967'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/sprachausgabe-mit-c.html' title='Sprachausgabe mit C#'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5795425001586815951</id><published>2011-03-18T15:52:00.003+01:00</published><updated>2011-03-18T16:06:45.859+01:00</updated><title type='text'>Speicherauslastung eines Prozesses ermitteln</title><content type='html'>Der heute Post wird nach den etwas längeren vorhergenden Posts wieder etwas kürzer, ich möchte euch zeigen, wie man mit C# die Speicherauslastung eines Prozesses ermittelt.&lt;br /&gt;Die dafür erforderliche Eigenschaft heißt &lt;em&gt;WorkingSet64&lt;/em&gt; aus der Klasse &lt;em&gt;System.Diagnostics.Process&lt;/em&gt;. Sie gibt die Anzahl an Bytes an, die von dem jeweiligen Prozess im Arbeitsspeicher belegt sind - korreliert also in etwa mit der Spalte "Arbeitsspeicher" im Taskmanager.&lt;br /&gt;Um die Speicherbenutzung eines bestimmten Prozesses zu ermitteln, muss dieser zuerst "abgegriffen" werden, zum Beispiel über die Funktion &lt;em&gt;Process.GetProcessesByName()&lt;/em&gt; (ein paar Hintergrundinfos zu dieser gibt's in &lt;a href="http://csharp-tricks.blogspot.com/2010/07/fenster-auswahlen-mit-findwindow.html"&gt;diesem&lt;/a&gt; Post).&lt;br /&gt;Die Funktion sucht nach Prozessen mit dem übergebenen Namen und speichert alle diese im Ergebnisarray.&lt;br /&gt;Der folgende Code ermittelt die Speicherauslastung des angegeben Prozesses, in dem er oben geannten Eigenschaft des ersten Eintrags im Array abfragt - falls mehrere Proezsse mit gleichem Namen vorhanden sind, müssen ggf. weitere Maßnahmen ergriffen werden.&lt;br /&gt;Im Beispiel wird die Auslastung des ersten geöffneten Editorprozesses abgefragt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Process[] Application;&lt;br /&gt;Application = Process.GetProcessesByName(&lt;span style="color:#A31414;"&gt;"notepad"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;long&lt;/span&gt; MemorySize = Application[0].WorkingSet64;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5795425001586815951?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5795425001586815951/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/speicherauslastung-eines-prozesses.html#comment-form' title='5 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5795425001586815951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5795425001586815951'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/speicherauslastung-eines-prozesses.html' title='Speicherauslastung eines Prozesses ermitteln'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4519856552053003344</id><published>2011-03-14T22:01:00.007+01:00</published><updated>2011-03-15T14:55:47.408+01:00</updated><title type='text'>Wave Dateien zusammenmischen (überblenden)</title><content type='html'>In den vorigen beiden Posts wurde das Wave Format auseinander genommen, es wurde gezeigt, wie mit C# &lt;a href="http://csharp-tricks.blogspot.com/2011/03/wave-dateien-einlesen.html"&gt;Wave Dateien eingelesen&lt;/a&gt; und &lt;a href="http://csharp-tricks.blogspot.com/2011/03/wave-dateien-schreiben.html"&gt;geschrieben&lt;/a&gt; werden können.&lt;br /&gt;In diesem Post möchte ich eine "coole" Anwendung zeigen, und zwar, wie man ein Programm erstellt, welches 2 Lieder ineinander übermischt.&lt;br /&gt;Das Zusammenmischen entsteht hier durch Überblenden (&lt;span style="font-style:italic;"&gt;Fading&lt;/span&gt;) der Lieder, das erste Lied wird gegen Ende hin immer leiser während das zweite Lied immer lauter wird.&lt;br /&gt;Viele wünschen sich wahrscheinlich eine Anwendung, die das selbe mit MP3 - Dateien macht - allerdings ist das MP3 Format um Längen komplizierter als das Wave Format.&lt;br /&gt;Es lassen sich aber beliebige MP3s mit dem in den vorigen Posts erwähnten Programm &lt;span style="font-style:italic;"&gt;Audacity&lt;/span&gt; in Wave Dateien umwandeln und dann bearbeiten.&lt;br /&gt;Der in diesem Post verwendete Code baut immer noch auf die Klasse &lt;span style="font-style:italic;"&gt;WaveFile&lt;/span&gt; auf, die in den beiden vorigen Posts angefangen wurde.&lt;br /&gt;Ein Beispielaufruf der benötigten Zeilen zum Mischen 2er Wave Dateien könnte so aussehen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaveFile WF1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; WaveFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WF1.LoadWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\101-die_atzen_-_disco_pogo-ysp.wav"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaveFile WF2 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; WaveFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WF2.LoadWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\StroboPopDieAtzenFeatNena.wav"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaveFile.StoreMixWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\mixed.wav"&lt;/span&gt;, WF1, WF2, 10);&lt;/blockquote&gt;&lt;br /&gt;Es werden also zuerst 2 Wave Dateien eingelesen und schließlich wird die statische Funktion &lt;span style="font-style:italic;"&gt;StoreMixWave()&lt;/span&gt; aufgerufen, welche als Parameter den Pfad zur Ergebnisdatei, die zu mischenden &lt;span style="font-style:italic;"&gt;WaveFiles&lt;/span&gt; sowie die Überblendezeit erwartet.&lt;br /&gt;Der Funktionscode sieht so aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreMixWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path, WaveFile wf1, WaveFile wf2, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; fadeTime)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaveFile Mixed = MixWave(wf1, wf2, fadeTime); &lt;span style="color:#008000;"&gt;// Ergebnisdatei mischen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Mixed.StoreWave(path); &lt;span style="color:#008000;"&gt;// Ergebnisdatei auf Festplatte speichern&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Der Ergebniswavefile wird also in der Funktion &lt;span style="font-style:italic;"&gt;MixWave()&lt;/span&gt; zusammengemischt, und dieser &lt;span style="font-style:italic;"&gt;WaveFile&lt;/span&gt; dann mit der bekannten Funktion &lt;span style="font-style:italic;"&gt;StoreWave()&lt;/span&gt; geschrieben.&lt;br /&gt;Nun betrachten wir direkt einmal den Code der Funktion &lt;span style="font-style:italic;"&gt;MixWave()&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; WaveFile MixWave(WaveFile wf1, WaveFile wf2, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; fadeTime)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FadeSamples = fadeTime * wf1.ByteRate / wf1.NumChannels; &lt;span style="color:#008000;"&gt;// Anzahl an aus-/ einzublenden Samples&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FadeBytes = fadeTime * wf1.ByteRate; &lt;span style="color:#008000;"&gt;// Anzahl an aus-/ einzublendenden Bytes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaveFile Result = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; WaveFile(); &lt;span style="color:#008000;"&gt;// Ergebnis Wave Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.FileSize = wf1.FileSize + wf2.DataSize - 2 * FadeBytes; &lt;span style="color:#008000;"&gt;// neue Dateigröße&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Format = &lt;span style="color:#A31414;"&gt;"WAVE"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Informationen aus dem fmt Chunk übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.FmtChunkSize = wf1.FmtChunkSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.AudioFormat = wf1.AudioFormat;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.NumChannels = wf1.NumChannels;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.SampleRate = wf1.SampleRate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.ByteRate = wf1.ByteRate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.BlockAlign = wf1.BlockAlign;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.BitsPerSample = wf1.BitsPerSample;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.DataSize = wf1.DataSize + wf2.DataSize - 2 * FadeBytes; &lt;span style="color:#008000;"&gt;// neue Größe des Data Chunks&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[wf1.NumChannels][]; &lt;span style="color:#008000;"&gt;// Anzahl an Kanälen übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; NumSamples = Result.DataSize / (Result.NumChannels * ( Result.BitsPerSample / 8)); &lt;span style="color:#008000;"&gt;// Anzahl an Samples ausrechnen, die sich in de Ergebnisdatei ergeben&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Die Data Arrays für alle Kanäle auf die Anzahl der Samples dimensionieren.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Result.Data.Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data[i] = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[NumSamples];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; PosCounter = 0; &lt;span style="color:#008000;"&gt;// Position des aktuellen Samples in der Ergebnisdatei&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Samples aus der ersten Wave Datei in das Data Feld der Ergebnisdatei kopieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; wf1.Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das aktuelle Sample in allen Kanälen übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; wf1.NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// fällt das aktuelle Sample in die Zeit, die überblendet werden soll, den Amplitudenwert der 1. Datei mit dem Amplitudenwert aus der 2. Datei mischen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (i &amp;gt; wf1.Data[0].Length - FadeSamples)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result.Data[j][PosCounter] = (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)(wf1.Data[j][i] * Factor(i - (wf1.Data[0].Length - FadeSamples), FadeSamples, 0) + wf2.Data[j][i - (wf1.Data[0].Length - FadeSamples)] * Factor(i - (wf1.Data[0].Length - FadeSamples), FadeSamples, 1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result.Data[j][PosCounter] = wf1.Data[j][i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PosCounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die restlichen Samples in die Ergebnisdatei übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = FadeSamples; i &amp;lt; wf2.Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; wf1.NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data[j][PosCounter] = wf2.Data[j][i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PosCounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;br /&gt;Am Anfang dieser wird die Anzahl der Samples berechnet, die überblendet werden sollen.&lt;br /&gt;Zur Erinnerung: Eine Wave Datei ist im Groben eine Sammlung von Luftdruckamplituden. Mit einer bestimmten Abtastrate werden in bestimmten Zeitabständen diese Amplituden gemessen und in der Datei gespeichert. Diese einzelnen Werte sind die Samples.&lt;br /&gt;Um 2 Audiodateien übereinander zu legen, kann man z.B. einfach die Amplituden addieren.&lt;br /&gt;Die Anzahl an zu überblenden Samples berechnet sich demnach als Produkt der Überblendzeit in Sekunden und Byterate (Anzahl der Bytes pro Sekunde, die beim Abspielen bearbeitet werden), dividiert durch die Anzahl der Kanäle (da die Byterate die Anzahl an Bytes von allen Kanälen angibt).&lt;br /&gt;Dann werden die Dateien zusammengemischt:&lt;br /&gt;Die ersten beiden Blöcke ("RIFF" und "fmt ") werden einfach aus der ersten übergebenen Wave Datei übernommen - allerdings wird natürlich die Dateigröße angepasst.&lt;br /&gt;Die neue Dateigröße ergibt sich als Summe der alten Dateigrößen, abzüglich 2mal der Anzahl an Bytes, die überblendet werden.&lt;br /&gt;Damit das Ergebnis auch nach etwas klingt, ist hier also Vorraussetzung, dass beide Wave Dateien einen ähnlichen fmt Block haben, sprich die selbe Abtastrate, Anzahl an Kanälen etc. Das ist aber eh der Fall, wenn man die Wave Dateien mit Audacity erstellt.&lt;br /&gt;Das Mischen der Data Chunks gestaltet sich nun als etwas komplizierter.&lt;br /&gt;Zuerst wird die Größe des resultierende Data Blocks berechnet und daraus dann die Anzahl an Samples, die in jedem Kanal gespeichert werden, um das &lt;span style="font-style:italic;"&gt;Data&lt;/span&gt; Array für alle Kanäle auf diesen Wert zu dimensionieren.&lt;br /&gt;Diese Anzahl berechnet sich laut Spezifikation des Wave Formats laut der Formel (Größe des Data Blocks) / (Anzahl Kanäle * BitsPerSample / 8).&lt;br /&gt;Die Variable &lt;span style="font-style:italic;"&gt;PosCounter&lt;/span&gt; zählt im folgenden die Position im &lt;span style="font-style:italic;"&gt;Data&lt;/span&gt; Array der Ergebnisdatei.&lt;br /&gt;Mit 2 Schleifen werden nun alle Samples der ersten Wave Datei durchgegangen und hierbei in jeder Iteration alle Kanäle dieser.&lt;br /&gt;Die entsprechenden Daten aus dem &lt;span style="font-style:italic;"&gt;Data&lt;/span&gt; Array werden an die Position &lt;span style="font-style:italic;"&gt;PosCounter&lt;/span&gt; im &lt;span style="font-style:italic;"&gt;Data&lt;/span&gt; Array der Ergebnisdatei geschrieben.&lt;br /&gt;Hat die Schleife eine Position erreicht, die näher als die Anzahl der zu überblenden Bytes am Ende der ersten Datei liegt, werden nicht einfach die Daten der 1. Datei kopiert, sondern nun mit denen der 2. Datei gemischt.&lt;br /&gt;Damit das 1. Lied langsam ausgeblendet während das 2. langsam eingeblendet wird, bestimmt die Funktion &lt;span style="font-style:italic;"&gt;Factor()&lt;/span&gt; den Anteil der jeweiligen Lieder an der Gesamtamplitude.&lt;br /&gt;Anschließend werden die noch nicht betrachteten Samples aus der 2. Datei in die Ergebnisdatei übernommen - fertig ist die Mischung!&lt;br /&gt;Schlussendlich noch eine Übersicht über den Code der kompletten Klasse &lt;span style="font-style:italic;"&gt;WaveFile&lt;/span&gt;, welchen alle 3 Posts zu diesem Thema benutzen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FileSize; &lt;span style="color:#008000;"&gt;// 1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Format; &lt;span style="color:#008000;"&gt;// 2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FmtChunkSize; &lt;span style="color:#008000;"&gt;// 3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; AudioFormat; &lt;span style="color:#008000;"&gt;// 4&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; NumChannels; &lt;span style="color:#008000;"&gt;// 5&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; SampleRate; &lt;span style="color:#008000;"&gt;// 6&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; ByteRate; &lt;span style="color:#008000;"&gt;// 7&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BlockAlign; &lt;span style="color:#008000;"&gt;// 8&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BitsPerSample; &lt;span style="color:#008000;"&gt;// 9&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; DataSize; &lt;span style="color:#008000;"&gt;// 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[][] Data; &lt;span style="color:#008000;"&gt;// 11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Einlesen&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; LoadWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.IO.FileStream fs = System.IO.File.OpenRead(path); &lt;span style="color:#008000;"&gt;// zu lesende Wave Datei öffnen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// RIFF Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// fmt Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// data Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; LoadChunk(System.IO.FileStream fs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Text.ASCIIEncoding Encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] bChunkID = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* Die ersten 4 Bytes einlesen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Diese ergeben bei jedem Chunk den jeweiligen Namen. */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(bChunkID, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; sChunkID = Encoder.GetString(bChunkID); &lt;span style="color:#008000;"&gt;// den Namen aus den Bytes dekodieren&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ChunkSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* Die nächsten 4 Bytes ergeben bei jedem Chunk die Größenangabe. */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(ChunkSize, 0, 4);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID.Equals(&lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim Riff Chunk ...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Größe in FileSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das Format einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Format = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(Format, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// ergibt "WAVE" als String&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Format = Encoder.GetString(Format);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID.Equals(&lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim fmt Chunk die Größe in FmtChunkSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FmtChunkSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// sowie die anderen Informationen auslesen und speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] AudioFormat = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(AudioFormat, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AudioFormat = System.BitConverter.ToInt16(AudioFormat, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] NumChannels = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(NumChannels, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels = System.BitConverter.ToInt16(NumChannels, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] SampleRate = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(SampleRate, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.SampleRate = System.BitConverter.ToInt32(SampleRate, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ByteRate = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(ByteRate, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ByteRate = System.BitConverter.ToInt32(ByteRate, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BlockAlign = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(BlockAlign, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.BlockAlign = System.BitConverter.ToInt16(BlockAlign, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BitsPerSample = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(BitsPerSample, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.BitsPerSample = System.BitConverter.ToInt16(BitsPerSample, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID == &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim data Chunk die Größenangabe in DataSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// der 1. Index von Data spezifiziert den Audiokanal, der 2. das Sample&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels][];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Temporäres Array zum Einlesen der jeweiligen Bytes eines Kanals pro Sample&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] temp = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[BlockAlign / NumChannels];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// für jeden Kanal das Data Array auf die Anzahl der Samples dimensionalisieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[i] = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.DataSize / (NumChannels * BitsPerSample / 8)];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// nacheinander alle Samples durchgehen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// alle Audiokanäle pro Sample durchgehen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die jeweils genutze Anzahl an Bytes pro Sample und Kanal einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (fs.Read(temp, 0, BlockAlign / NumChannels) &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// je nachdem, wie viele Bytes für einen Wert genutzt werden,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Amplitude als Int16 oder Int32 interpretieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BlockAlign / NumChannels == 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[j][i] = System.BitConverter.ToInt16(temp, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[j][i] = System.BitConverter.ToInt32(temp, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * andere Werte als 2 oder 4 werden nicht behandelt, hier bei Bedarf ergänzen!&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Schreiben&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.IO.FileStream fs = System.IO.File.OpenWrite(path); &lt;span style="color:#008000;"&gt;// zu schreiben Wave Datei öffnen / erstellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// RIFF Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// fmt Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// data Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreChunk(System.IO.FileStream fs, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; chunkID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Text.ASCIIEncoding Decoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// den Namen in Bytes konvertieren und schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(Decoder.GetBytes(chunkID), 0, 4);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// im RIFF Chunk, FileSize als Größe und das Audioformat schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(FileSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(Decoder.GetBytes(Format), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim fmt Chunk die Größe dieses sowie die weiteren kodierten Informationen schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(FmtChunkSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(AudioFormat), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(NumChannels), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(SampleRate), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(ByteRate), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(BlockAlign), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(BitsPerSample), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim data Chunk die Größe des Datenblocks als Größenangabe schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(DataSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// dann die einzelnen Amplituden, wie beschrieben Sample für Sample mit jeweils allen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Audiospuren, schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(Data[j][i]), 0, BlockAlign / NumChannels);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Mischen&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; MixWave(&lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; wf1, &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; wf2, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; fadeTime)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FadeSamples = fadeTime * wf1.ByteRate / wf1.NumChannels; &lt;span style="color:#008000;"&gt;// Anzahl an aus-/ einzublenden Samples&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FadeBytes = fadeTime * wf1.ByteRate; &lt;span style="color:#008000;"&gt;// Anzahl an aus-/ einzublendenden Bytes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; Result = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt;(); &lt;span style="color:#008000;"&gt;// Ergebnis Wave Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.FileSize = wf1.FileSize + wf2.DataSize - 2 * FadeBytes; &lt;span style="color:#008000;"&gt;// neue Dateigröße&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Format = &lt;span style="color:#A31414;"&gt;"WAVE"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Informationen aus dem fmt Chunk übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.FmtChunkSize = wf1.FmtChunkSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.AudioFormat = wf1.AudioFormat;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.NumChannels = wf1.NumChannels;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.SampleRate = wf1.SampleRate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.ByteRate = wf1.ByteRate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.BlockAlign = wf1.BlockAlign;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.BitsPerSample = wf1.BitsPerSample;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.DataSize = wf1.DataSize + wf2.DataSize - 2 * FadeBytes; &lt;span style="color:#008000;"&gt;// neue Größe des Data Chunks&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[wf1.NumChannels][]; &lt;span style="color:#008000;"&gt;// Anzahl an Kanälen übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; NumSamples = Result.DataSize / (Result.NumChannels * ( Result.BitsPerSample / 8)); &lt;span style="color:#008000;"&gt;// Anzahl an Samples ausrechnen, die sich in de Ergebnisdatei ergeben&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Die Data Arrays für alle Kanäle auf die Anzahl der Samples dimensionieren.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Result.Data.Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data[i] = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[NumSamples];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; PosCounter = 0; &lt;span style="color:#008000;"&gt;// Position des aktuellen Samples in der Ergebnisdatei&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Samples aus der ersten Wave Datei in das Data Feld der Ergebnisdatei kopieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; wf1.Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das aktuelle Sample in allen Kanälen übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; wf1.NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// fällt das aktuelle Sample in die Zeit, die überblendet werden soll, den Amplitudenwert der 1. Datei mit dem Amplitudenwert aus der 2. Datei mischen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (i &amp;gt; wf1.Data[0].Length - FadeSamples)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result.Data[j][PosCounter] = (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)(wf1.Data[j][i] * Factor(i - (wf1.Data[0].Length - FadeSamples), FadeSamples, 0) + wf2.Data[j][i - (wf1.Data[0].Length - FadeSamples)] * Factor(i - (wf1.Data[0].Length - FadeSamples), FadeSamples, 1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result.Data[j][PosCounter] = wf1.Data[j][i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PosCounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die restlichen Samples in die Ergebnisdatei übernehmen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = FadeSamples; i &amp;lt; wf2.Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; wf1.NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result.Data[j][PosCounter] = wf2.Data[j][i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PosCounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Diese Funktion dient zur Berechnung der Gewichtung der Amplituden bei Übermischung.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="pos"&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;Position in Datei relativ zum Anfang der Überblendezeit&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="max"&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;Ende der Überblendung, relativ zu pos&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="song"&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;Kann die Werte 0 (auszublendender Song) oder 1 (einzublender Song) annehmen&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; Factor(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; pos, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; max, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; song)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (song == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; 1 - Math.Pow((&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;)pos / (&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;)max, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Math.Pow((&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;)pos / (&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;)max, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreMixWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path, &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; wf1, &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; wf2, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; fadeTime)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; Mixed = MixWave(wf1, wf2, fadeTime); &lt;span style="color:#008000;"&gt;// Ergebnisdatei mischen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Mixed.StoreWave(path); &lt;span style="color:#008000;"&gt;// Ergebnisdatei auf Festplatte speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4519856552053003344?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4519856552053003344/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-zusammenmischen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4519856552053003344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4519856552053003344'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-zusammenmischen.html' title='Wave Dateien zusammenmischen (überblenden)'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5999255713760059302</id><published>2011-03-10T16:04:00.000+01:00</published><updated>2011-03-10T16:04:00.258+01:00</updated><title type='text'>Wave Dateien schreiben</title><content type='html'>Im vorigen Post wurde gezeigt, wie man &lt;a href="http://csharp-tricks.blogspot.com/2011/03/wave-dateien-einlesen.html"&gt;Wave Dateien byteweise einlesen&lt;/a&gt; kann. Jetzt möchte ich zeigen, wie man die Audiodateien erstellt.&lt;br /&gt;Hierbei beschränke ich mich nur auf die Umkehrung des vorher beschriebenen Lesens, ich zeige in diesem Post also wie man eine vorher eingelesene Wave Datei wieder als Datei auf die Festplatte schreibt.&lt;br /&gt;Im vorigen Post wurde der Aufbau von Wave Dateien und allerlei anderes Grundlegendes erläutert, deshalb poste ich hier nur kurz den Quellcode von 2 Funktionen, um die die Klasse &lt;span style="font-style:italic;"&gt;WaveFile&lt;/span&gt; erweitert werden muss, damit Wave Dateien auch geschrieben werden können.&lt;br /&gt;Das Prinzip ist analog zur Implementierung des Lesens, nacheinander werden die 3 Blöcke "RIFF", "fmt " und "data" in eine Datei geschrieben.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.IO.FileStream fs = System.IO.File.OpenWrite(path); &lt;span style="color:#008000;"&gt;// zu schreiben Wave Datei öffnen / erstellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// RIFF Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// fmt Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StoreChunk(fs, &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// data Chunk schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; StoreChunk(System.IO.FileStream fs, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; chunkID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Text.ASCIIEncoding Decoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// den Namen in Bytes konvertieren und schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(Decoder.GetBytes(chunkID), 0, 4);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// im RIFF Chunk, FileSize als Größe und das Audioformat schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(FileSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(Decoder.GetBytes(Format), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim fmt Chunk die Größe dieses sowie die weiteren kodierten Informationen schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(FmtChunkSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(AudioFormat), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(NumChannels), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(SampleRate), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(ByteRate), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(BlockAlign), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(BitsPerSample), 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (chunkID == &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim data Chunk die Größe des Datenblocks als Größenangabe schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(DataSize), 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// dann die einzelnen Amplituden, wie beschrieben Sample für Sample mit jeweils allen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Audiospuren, schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(System.BitConverter.GetBytes(Data[j][i]), 0, BlockAlign / NumChannels);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Eine beispielhafte Implementierung, welche eine Wave Datei einliest und diese schließlich wieder als Datei auf die Festplatte schreibt, könnte so aussehen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;WaveFile WF1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; WaveFile();&lt;br /&gt;WF1.LoadWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\mix.wav"&lt;/span&gt;);&lt;br /&gt;WF1.StoreWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\stored.wav"&lt;/span&gt;);&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5999255713760059302?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5999255713760059302/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-schreiben.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5999255713760059302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5999255713760059302'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-schreiben.html' title='Wave Dateien schreiben'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-3694882279919605039</id><published>2011-03-07T20:37:00.005+01:00</published><updated>2011-03-09T01:22:11.072+01:00</updated><title type='text'>Wave Dateien einlesen</title><content type='html'>In diesem Post möchte ich zeigen, wie man mit der Programmiersprache C# Wave Dateien einliest. Es geht hier allerdings nicht um das Abspielen etc., sondern um die genaue Analyse des Dateiformats, also wie eine Wave Datei aufgebaut ist und wie man sie byteweise einlesen kann (zum Abspielen geht's &lt;a href="http://csharp-tricks.blogspot.com/2010/06/wave-datei-abspielen.html"&gt;hier&lt;/a&gt;).&lt;br /&gt;Eine Wave Datei ist eine Audiodatei, die somit Schallfrequenzen speichert.&lt;br /&gt;Aufgebaut ist sie auf Datenebene aus mehreren &lt;span style="font-style:italic;"&gt;Chunks&lt;/span&gt; (Blöcken). Mit diesen lässt sich einiges anstellen, ich werde mich in diesem Post allerdings nur auf die einfachste Form (aber zugleich auch der Standard) des Wave Formats beschränken (dieses wird auf &lt;a href="https://ccrma.stanford.edu/courses/422/projects/WaveFormat/"&gt;dieser Seite&lt;/a&gt; erläutert), welches aus 3 &lt;span style="font-style:italic;"&gt;Chunks&lt;/span&gt; besteht.&lt;br /&gt;Auf der eben genannten Seite (und auf vielen anderen auch) wird das Wave Format sehr schön erklärt, ich fasse diese Infos hier nur kurz zusammen und lasse einiges weg.&lt;br /&gt;Ein kleiner Tipp noch: Wave Dateien, mit exakt dem Aufbau wie sie hier beschrieben werden, können sehr gut mit dem kostenlosen Programm &lt;a href="http://www.chip.de/downloads/Audacity_13010690.html"&gt;Audacity&lt;/a&gt; erzeugt werden (zum Beispiel aus MP3 - Dateien).&lt;br /&gt;&lt;br /&gt;Die ersten 2 Einträge eines &lt;span style="font-style:italic;"&gt;Chunks&lt;/span&gt; sind immer die gleichen: Mit jeweils 4 Byte werden Name des &lt;span style="font-style:italic;"&gt;Chunks&lt;/span&gt; und eine Größenangabe codiert.&lt;br /&gt;Der 1. &lt;span style="font-style:italic;"&gt;Chunk&lt;/span&gt; trägt den Namen "RIFF". Die folgende Größenangabe &lt;span style="font-style:italic;"&gt;(1)&lt;/span&gt; bezeichnet die Größe der gesamten Wavedatei in Bytes - 8, da der Name und die Größe nicht mitgezählt werden.&lt;br /&gt;An 3. Position im 1. Block steht die Zeichenkette "WAVE" &lt;span style="font-style:italic;"&gt;(2)&lt;/span&gt;.&lt;br /&gt;Nun folgt der 2. &lt;span style="font-style:italic;"&gt;Chunk&lt;/span&gt;, mit Namen "fmt " (das Leerzeichen ist wichtig).&lt;br /&gt;Die Größenangabe &lt;span style="font-style:italic;"&gt;(3)&lt;/span&gt; speichert den Wert 16, sie bezeichnet die Größe dieses Blocks.&lt;br /&gt;In den nächsten 2 Bytes wird das Audioformat &lt;span style="font-style:italic;"&gt;(4)&lt;/span&gt; gespeichert: 1 bedeutet normale Speicherung, andere Werte zeigen eine Kompression an.&lt;br /&gt;Mit den nächsten 2 Bytes werden die Anzahl der Audiospuren &lt;span style="font-style:italic;"&gt;(5)&lt;/span&gt; kodiert.&lt;br /&gt;Die nächsten 4 Bytes speichern die Abtastrate pro Sekunde &lt;span style="font-style:italic;"&gt;(6)&lt;/span&gt;, also wie viele Werte des Audiosignals pro Sekunde gespeichert werden.&lt;br /&gt;In den nächsten 4 Bytes wird die Byterate &lt;span style="font-style:italic;"&gt;(7)&lt;/span&gt; gespeichert, das heißt wie viele Bytes pro Sekunde zum Abspielen des Audiosignals abgerufen werden müssen.&lt;br /&gt;Die nächsten 2 Bytes geben die Anzahl an Bytes an, die zur Beschreibung eines einzelnen Abtastwerts (unter Betrachtung aller Audiospuren) genutzt werden &lt;span style="font-style:italic;"&gt;(8)&lt;/span&gt;.&lt;br /&gt;Die letzten 2 Bytes dieses Blocks geben schließlich die Anzahl an Bits (kleine Erinnerung: 1 Byte = 8 Bit) an, die zur Speicherung eines einzelnen Abtastwerts (bezüglich nur eines Kanals) genutzt werden &lt;span style="font-style:italic;"&gt;(9)&lt;/span&gt;.&lt;br /&gt;Nun folgt der 3. Block, der Datenblock.&lt;br /&gt;Am Anfang dieses befinden sich wieder mit je 4 Bytes der Name ("data") und die Größe &lt;span style="font-style:italic;"&gt;(10)&lt;/span&gt; dieses.&lt;br /&gt;Danach folgen die eigentlichen Daten &lt;span style="font-style:italic;"&gt;(11)&lt;/span&gt; der Wave Datei, die ja im Prinzip Luftdrücke sind, also Audioamplituden.&lt;br /&gt;Die Samples sind nacheinander abgespeichert, die verschiedenen Audiospuren stehen dabei direkt hintereinander. In dem "data" Block steht also zuerst Sample 1, wobei in diesem Abschnitt erst Audiokanal 1, dann ggf. Kanal 2 ... etc. steht, dann Sample 2 mit Kanal 1 als erstem und ggf. den anderen, usw.&lt;br /&gt;Die entsprechende Anzahl Bytes pro Sample und Kanal ergeben als Integer interpretiert die Amplitude an der aktuellen Abtaststelle.&lt;br /&gt;&lt;br /&gt;Damit wäre meine kleine Beschreibung des Wave Formats fertig, jetzt folgt der Code eines C# Programms, welches Wave Dateien einlesen kann, die nach obiger Beschreibung aufgebaut sind.&lt;br /&gt;Kern des Programms ist die Klasse &lt;span style="font-style:italic;"&gt;WaveFile&lt;/span&gt;, sie stellt eine Funktion zum Einlesen von Wave Dateien dar und speichert als Instanz die Informationen einer Datei.&lt;br /&gt;Die oben beschriebenen Angaben zum Dateiinhalt (Anzahl der Kanäle etc.) sind im Quellcode mit den oben benutzten Nummern gekennzeichnet.&lt;br /&gt;Oberfunktion zum Einlesen einer Wave Datei ist &lt;span style="font-style:italic;"&gt;LoadWave()&lt;/span&gt;, der der Pfad zur Datei übergeben werden muss.&lt;br /&gt;In dieser Funktion wird dann 3mal die Funktion &lt;span style="font-style:italic;"&gt;LoadChunk()&lt;/span&gt; aufruft, welche einen Block ausliest.&lt;br /&gt;Zuerst wird der Name des Blocks analysiert und dann das weitere Vorgehen angepasst.&lt;br /&gt;Ich hoffe der Rest des Quellcodes ist aus den Kommentaren etc. verständlich.&lt;br /&gt;Wie für alle Programme hier gilt: Das Programm ist nur eine erste Anregung zur weiteren Arbeit, eine Fehlerbehandlung o.ä. gibt es nicht.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt; : Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt; WF1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WF1.LoadWave(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\mix.wav"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;WaveFile&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FileSize; &lt;span style="color:#008000;"&gt;// 1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Format; &lt;span style="color:#008000;"&gt;// 2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; FmtChunkSize; &lt;span style="color:#008000;"&gt;// 3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; AudioFormat; &lt;span style="color:#008000;"&gt;// 4&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; NumChannels; &lt;span style="color:#008000;"&gt;// 5&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; SampleRate; &lt;span style="color:#008000;"&gt;// 6&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; ByteRate; &lt;span style="color:#008000;"&gt;// 7&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BlockAlign; &lt;span style="color:#008000;"&gt;// 8&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BitsPerSample; &lt;span style="color:#008000;"&gt;// 9&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; DataSize; &lt;span style="color:#008000;"&gt;// 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[][] Data; &lt;span style="color:#008000;"&gt;// 11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; LoadWave(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.IO.FileStream fs = System.IO.File.OpenRead(path); &lt;span style="color:#008000;"&gt;// zu lesende Wave Datei öffnen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// RIFF Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// fmt Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadChunk(fs); &lt;span style="color:#008000;"&gt;// data Chunk einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; LoadChunk(System.IO.FileStream fs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Text.ASCIIEncoding Encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] bChunkID = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* Die ersten 4 Bytes einlesen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Diese ergeben bei jedem Chunk den jeweiligen Namen. */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(bChunkID, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; sChunkID = Encoder.GetString(bChunkID); &lt;span style="color:#008000;"&gt;// den Namen aus den Bytes dekodieren&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ChunkSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* Die nächsten 4 Bytes ergeben bei jedem Chunk die Größenangabe. */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(ChunkSize, 0, 4);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID.Equals(&lt;span style="color:#A31414;"&gt;"RIFF"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim Riff Chunk ...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Größe in FileSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das Format einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Format = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(Format, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// ergibt "WAVE" als String&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Format = Encoder.GetString(Format);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID.Equals(&lt;span style="color:#A31414;"&gt;"fmt "&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim fmt Chunk die Größe in FmtChunkSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FmtChunkSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// sowie die anderen Informationen auslesen und speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] AudioFormat = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(AudioFormat, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AudioFormat = System.BitConverter.ToInt16(AudioFormat, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] NumChannels = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(NumChannels, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels = System.BitConverter.ToInt16(NumChannels, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] SampleRate = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(SampleRate, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.SampleRate = System.BitConverter.ToInt32(SampleRate, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ByteRate = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(ByteRate, 0, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ByteRate = System.BitConverter.ToInt32(ByteRate, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BlockAlign = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(BlockAlign, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.BlockAlign = System.BitConverter.ToInt16(BlockAlign, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BitsPerSample = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Read(BitsPerSample, 0, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.BitsPerSample = System.BitConverter.ToInt16(BitsPerSample, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (sChunkID == &lt;span style="color:#A31414;"&gt;"data"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// beim data Chunk die Größenangabe in DataSize speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataSize = System.BitConverter.ToInt32(ChunkSize, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// der 1. Index von Data spezifiziert den Audiokanal, der 2. das Sample&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels][];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Temporäres Array zum Einlesen der jeweiligen Bytes eines Kanals pro Sample&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] temp = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[BlockAlign / NumChannels];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// für jeden Kanal das Data Array auf die Anzahl der Samples dimensionalisieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.NumChannels; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[i] = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;[&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.DataSize / (NumChannels * BitsPerSample / 8)];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// nacheinander alle Samples durchgehen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Data[0].Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// alle Audiokanäle pro Sample durchgehen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; j = 0; j &amp;lt; NumChannels; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die jeweils genutze Anzahl an Bytes pro Sample und Kanal einlesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (fs.Read(temp, 0, BlockAlign / NumChannels) &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// je nachdem, wie viele Bytes für einen Wert genutzt werden,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Amplitude als Int16 oder Int32 interpretieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BlockAlign / NumChannels == 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[j][i] = System.BitConverter.ToInt16(temp, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data[j][i] = System.BitConverter.ToInt32(temp, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * andere Werte als 2 oder 4 werden nicht behandelt, hier bei Bedarf ergänzen!&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-3694882279919605039?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/3694882279919605039/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-einlesen.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3694882279919605039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3694882279919605039'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/03/wave-dateien-einlesen.html' title='Wave Dateien einlesen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-162962451309533791</id><published>2011-02-24T15:42:00.002+01:00</published><updated>2011-02-24T16:00:36.287+01:00</updated><title type='text'>Lieder mit iTunes abspielen, in Wiedergabelisten navigieren</title><content type='html'>Im vorigen Post wurde gezeigt, wie man &lt;a href="http://csharp-tricks.blogspot.com/2011/02/bestimmte-titel-in-itunes-suchen.html"&gt;bestimmte Lieder in iTunes&lt;/a&gt; suchen kann, heute möchte ich nocheinmal explizit darauf eingehen, wie man Lieder abspielt und wie man in Wiedergabelisten navigiert, ein Lied vor etc ...&lt;br /&gt;Zum Abspielen eines Lieds ist die Funktion &lt;span style="font-style:italic;"&gt;Play()&lt;/span&gt; nötig, die von einem Objekt vom Typ &lt;span style="font-style:italic;"&gt;IITTrack&lt;/span&gt; aufgerufen werden muss.&lt;br /&gt;Wie im vorigen Post beschrieben kann also nach einem bestimmten Lied in der gesamten Musikbibliothek gesucht werden, bei Sucherfolg kann dieses dann mittels &lt;span style="font-style:italic;"&gt;Play() &lt;/span&gt;abgespielt werden.&lt;br /&gt;Folgendes Beispiel spielt das 10. Lied aus der Musikbibliothek ab:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITTrack track &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; iTunesPlayer.LibraryPlaylist.Tracks)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (counter++ &amp;gt; 10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;track.Play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Eine ganze Wiedergabe kann über die Funktion &lt;span style="font-style:italic;"&gt;PlayFirstTrack()&lt;/span&gt; abgespielt werden, die passenderweise von einer Wiedergabeliste aus (von einem Objekt vom Typ &lt;span style="font-style:italic;"&gt;IITPlaylist&lt;/span&gt;) aufgerufen wird.&lt;br /&gt;Die folgende Funktion sucht nach einer Playlist, dessen Namen dem übergebenen Parameter entspricht, und gibt diese dann zurück:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; IITPlaylist SuchePlayList(iTunesApp iTunesPlayer, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; name)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITPlaylist playlist &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; iTunesPlayer.LibrarySource.Playlists)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (playlist.Name == name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; playlist;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Wenn wir nun eine bestimmte Wiedergabeliste abspielen wollen, rufen wir die Suchfunktion mit dem Namen dieser auf und rufen dann die Funktion &lt;span style="font-style:italic;"&gt;PlayFirstTrack()&lt;/span&gt; auf:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;IITPlaylist Techno = SuchePlayList(iTunesPlayer, &lt;span style="color:#A31414;"&gt;"Techno"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Techno != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Techno.PlayFirstTrack();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Zum vorigen / nächsten Lied springen kann man über die Funktionen &lt;span style="font-style:italic;"&gt;NextTrack()&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;PreviousTrack()&lt;/span&gt;, die über das iTunes Player Objekt aufgerufen werden:&lt;br /&gt;&lt;blockquote&gt;iTunesPlayer.NextTrack();&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;iTunesPlayer.PreviousTrack();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-162962451309533791?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/162962451309533791/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/lieder-mit-itunes-abspielen-in.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/162962451309533791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/162962451309533791'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/lieder-mit-itunes-abspielen-in.html' title='Lieder mit iTunes abspielen, in Wiedergabelisten navigieren'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-7612586009084929303</id><published>2011-02-23T08:00:00.000+01:00</published><updated>2011-02-23T08:00:01.436+01:00</updated><title type='text'>Bestimmte Titel in iTunes suchen</title><content type='html'>Nachdem im vorigen Post gezeigt wurde, wie man die &lt;a href="http://csharp-tricks.blogspot.com/2011/02/itunes-mediathek-durchlaufen.html"&gt;komplette iTunes Mediathek&lt;/a&gt; durchläuft, möchte ich nun eine Möglichkeit zeigen, wie man nach bestimmten Titeln suchen kann.&lt;br /&gt;Hierzu durchläuft man wie beschrieben die Mediathek oder bestimmte Playlists und prüft, ob die Suchkriterien erfüllt sind.&lt;br /&gt;Die unten stehende Funktion sucht nach Interpret und Titel und gibt anschließend den gewünschten Track zurück.&lt;br /&gt;Bei einer kompletten Suche kann es natürlich vorkommen, dass mehrere Ergebnisse gefunden werden, als Ergebnis würde sich dann eine Liste anbieten.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; IITTrack Suche(iTunesApp iTunesPlayer, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; artist, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; title)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITTrack track &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; iTunesPlayer.LibraryPlaylist.Tracks)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (track.Artist == artist &amp;amp;&amp;amp; track.Name == title)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; track;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;So könnte die Suchfunktion beispielsweise eingebunden werden, folgende Codezeilen suchen nach dem Lied "Saturday" von "Basshunter" und spielen dieses dann ab:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;IITTrack Ergebnis = Suche(iTunesPlayer, &lt;span style="color:#A31414;"&gt;"Basshunter"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;"Saturday"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Ergebnis != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ergebnis.Play();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-7612586009084929303?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/7612586009084929303/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/bestimmte-titel-in-itunes-suchen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7612586009084929303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7612586009084929303'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/bestimmte-titel-in-itunes-suchen.html' title='Bestimmte Titel in iTunes suchen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-7879016565018361327</id><published>2011-02-17T23:44:00.002+01:00</published><updated>2011-02-18T00:13:08.025+01:00</updated><title type='text'>iTunes Mediathek durchlaufen</title><content type='html'>In diesem Post möchte ich euch zeigen, wie man in C# die komplette iTunes Mediathek bzw. einzelne Wiedergabeliste durchlaufen kann.&lt;br /&gt;Voraussetzung hierfür ist der vorige Post (&lt;a href="http://csharp-tricks.blogspot.com/2011/02/itunes-einbinden.html"&gt;Einbinden von iTunes in C#&lt;/a&gt;).&lt;br /&gt;Sei &lt;span style="font-style:italic;"&gt;iTunesPlayer&lt;/span&gt; nun wieder ein Objekt vom Typ &lt;span style="font-style:italic;"&gt;iTunesApp&lt;/span&gt;, welches auf iTunes referenziert.&lt;br /&gt;Dann liefert die Eigenschaft &lt;span style="font-style:italic;"&gt;iTunesPlayer.LibraryPlaylist.Tracks&lt;/span&gt; alle in iTunes geladenen Mediendateien als Objekte vom Typ &lt;span style="font-style:italic;"&gt;IITTrack&lt;/span&gt;.&lt;br /&gt;Folgender Beispielcode schreibt alle Titel in eine Textbox (diese heißt &lt;span style="font-style:italic;"&gt;textBox1&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;Multiline&lt;/span&gt; muss auf &lt;span style="font-style:italic;"&gt;true&lt;/span&gt; stehen und &lt;span style="font-style:italic;"&gt;Scrollbars&lt;/span&gt; sollten aktiviert sein):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;iTunesApp iTunesPlayer = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; iTunesApp();&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITTrack track &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; iTunesPlayer.LibraryPlaylist.Tracks)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox1.Text += track.Artist + &lt;span style="color:#A31414;"&gt;" - "&lt;/span&gt; + track.Name + Environment.NewLine;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Es können aber auch gezielt einzelne Wiedergabelisten (&lt;span style="font-style:italic;"&gt;Playlists&lt;/span&gt;) angesprochen werden.&lt;br /&gt;Über die Eigenschaft &lt;span style="font-style:italic;"&gt;iTunesPlayer.LibrarySource.Playlists&lt;/span&gt; kann auf alle angelegten &lt;span style="font-style:italic;"&gt;Playlists&lt;/span&gt; zugegriffen werden.&lt;br /&gt;Jede &lt;span style="font-style:italic;"&gt;Playlist&lt;/span&gt; hat dann wieder die Eigenschaft &lt;span style="font-style:italic;"&gt;Tracks&lt;/span&gt;, worin die Mediendateien der Liste gespeichert sind.&lt;br /&gt;Der folgende Beispielcode schreibt in eine Textbox alle Wiedergabelisten aus iTunes samt Titeln (als 1. Wiedergabeliste erscheint die Wiedergabeliste "Mediathek", welche die gesamte Bibliothek enthält):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITPlaylist playlist &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; iTunesPlayer.LibrarySource.Playlists)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox1.Text += &lt;span style="color:#A31414;"&gt;"Wiedergabeliste: "&lt;/span&gt; + playlist.Name + Environment.NewLine + Environment.NewLine;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (IITTrack track &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; playlist.Tracks)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox1.Text += track.Artist + &lt;span style="color:#A31414;"&gt;" - "&lt;/span&gt; + track.Name + Environment.NewLine;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox1.Text += &lt;span style="color:#A31414;"&gt;"--------------"&lt;/span&gt; + Environment.NewLine + Environment.NewLine;&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-7879016565018361327?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/7879016565018361327/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/itunes-mediathek-durchlaufen.html#comment-form' title='5 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7879016565018361327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7879016565018361327'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/itunes-mediathek-durchlaufen.html' title='iTunes Mediathek durchlaufen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-6236645535454141036</id><published>2011-02-17T22:11:00.007+01:00</published><updated>2011-02-18T00:13:56.112+01:00</updated><title type='text'>iTunes einbinden</title><content type='html'>Die nächste Postreihe wird sich mit dem Musikprogramm &lt;span style="font-style:italic;"&gt;iTunes&lt;/span&gt; von Apple beschäftigen.&lt;br /&gt;Hierzu werde ich mehrere Posts veröffentlichen, die verschiedene Funktionen der Anbindung zeigen.&lt;br /&gt;In diesem ersten Post zeige ich, wie man &lt;span style="font-style:italic;"&gt;iTunes&lt;/span&gt; grundsätzlich in ein C# - Programm einbindet - hierfür ist gar keine zusätzliche Software wie das &lt;span style="font-style:italic;"&gt;iTunes SDK&lt;/span&gt; nötig, schon bei der "normalen" Installation von &lt;span style="font-style:italic;"&gt;iTunes&lt;/span&gt; wird das benötigte &lt;span style="font-style:italic;"&gt;COM&lt;/span&gt; - Objekt mitinstalliert.&lt;br /&gt;Um nun in einem bestehnden C# - Projekt eine Referenz zu diesem einzufügen, ist der Menüaufruf &lt;span style="font-style:italic;"&gt;Projekt - Verweis&lt;/span&gt;&lt;span style="font-style:italic;"&gt; hinzufügen &lt;/span&gt;nötig.&lt;br /&gt;Dann wechselt man zur Spalte &lt;span style="font-style:italic;"&gt;COM&lt;/span&gt; und wählt dort das Objekt i&lt;span style="font-style:italic;"&gt;Tunes 1.13 Type Library&lt;/span&gt; aus (die Versionsnummer kann natürlich anders lauten). Und schon ist &lt;span style="font-style:italic;"&gt;iTunes&lt;/span&gt; fertig zur Nutzung!&lt;br /&gt;Der Einfachkeit halber importieren wir die entsprechende Bibliothek mittels &lt;span style="font-style:italic;"&gt;using&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; iTunesLib;&lt;/blockquote&gt;&lt;br /&gt;Im Programm kann dann eine Instanz des iTunes Players beispielsweise so instanziert werden:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;iTunesApp iTunesPlayer = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; iTunesApp();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Wird diese Zeile im Programm ausgeführt, öffnet sich &lt;span style="font-style:italic;"&gt;iTunes&lt;/span&gt; (wenn nicht bereits offen), und die Player Instanz wird mit dem Objekt im C# - Programm verknüpft.&lt;br /&gt;Im nächsten Post beschreibe ich das &lt;a href="http://csharp-tricks.blogspot.com/2011/02/itunes-mediathek-durchlaufen.html"&gt;Durchlaufen aller Lieder der Musikbibliothek / verschiedener Wiedergabelisten&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-6236645535454141036?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/6236645535454141036/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/itunes-einbinden.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6236645535454141036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/6236645535454141036'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/itunes-einbinden.html' title='iTunes einbinden'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4877716276984761920</id><published>2011-02-17T01:29:00.005+01:00</published><updated>2011-04-03T14:39:16.526+02:00</updated><title type='text'>Google Earth einbinden</title><content type='html'>So hallo, nach längerer Pause erscheint heute (endlich) mal wieder ein Post.&lt;br /&gt;Tut mir Leid für die lange Zeit ohne, ich bin ziemlich beschäftigt im Moment, aber der Blog wird auf jeden Fall weiter gehen.&lt;br /&gt;&lt;br /&gt;Der heutige Post ist eigentlich auch nur ein kurzer, allerdings dürfte er recht interessant werden.&lt;br /&gt;Und zwar möchte ich kurz zeigen, wie man &lt;span style="font-style:italic;"&gt;Google Earth&lt;/span&gt; in eine C# Anwendung einbinden kann.&lt;br /&gt;Wie für viele Sachen gibt es von Google hierzu eine Programmbibliothek, die &lt;span style="font-style:italic;"&gt;Google Earth API&lt;/span&gt;. In diesem Post hier geht's allerdings nur um eine erste Bereitstellung von Google Earth, dazu wird diese API gar nicht benötigt, denn online stellt Google ein Plugin für Desktopanwendungen bereit, welches sich im Browser betrachten lässt.&lt;br /&gt;Dieses Plugin ist erreichbar unter der URL &lt;span style="font-style:italic;"&gt;http://earth-api-samples.googlecode.com/svn/trunk/demos/desktop-embedded/pluginhost.html&lt;/span&gt;, wir müssen diese Seite nur noch in einem &lt;span style="font-style:italic;"&gt;Webbrowser&lt;/span&gt; Steuerelement auf einem Formular unterbringen und schon haben wir den von Google Earth gewohnten bedienbaren Globus!&lt;br /&gt;Ein kleines Manko ist, dass die Endnutzer das Plugin installieren müssen, allerdings wird das Fehlen dieses auch im &lt;span style="font-style:italic;"&gt;Webbrowser&lt;/span&gt; Control angezeigt und kann mit einem Klick heruntergeladen werden.&lt;br /&gt;Heißt das auf dem Formular platzierte Steuerlement &lt;span style="font-style:italic;"&gt;webBrowser1&lt;/span&gt;, ruft folgender Code das Plugin auf:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;webBrowser1.Navigate(&lt;span style="color:#A31414;"&gt;@"http://earth-api-samples.googlecode.com/svn/trunk/demos/desktop-embedded/pluginhost.html"&lt;/span&gt;);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;So könnte dann eine beispielhafte Anwendung aussehen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-N77IDxLNk34/TVxt0JAHbYI/AAAAAAAAADc/Ucq2t03kBY8/s1600/Unbenannt.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 219px;" src="http://2.bp.blogspot.com/-N77IDxLNk34/TVxt0JAHbYI/AAAAAAAAADc/Ucq2t03kBY8/s320/Unbenannt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5574451181314862466" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4877716276984761920?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4877716276984761920/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/google-earth-einbinden.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4877716276984761920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4877716276984761920'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2011/02/google-earth-einbinden.html' title='Google Earth einbinden'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-N77IDxLNk34/TVxt0JAHbYI/AAAAAAAAADc/Ucq2t03kBY8/s72-c/Unbenannt.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-8287280745243990328</id><published>2010-12-30T12:53:00.000+01:00</published><updated>2010-12-30T12:53:08.825+01:00</updated><title type='text'>Youtube durchsuchen</title><content type='html'>In diesem Post möchte ich euch zeigen, wie man mit C# Youtube durchsuchen, also auf der Plattform nach bestimmten Videos suchen kann.&lt;br /&gt;Hierfür benötigen wie die &lt;span style="font-style:italic;"&gt;Google Data API&lt;/span&gt;, insbesondere das &lt;span style="font-style:italic;"&gt;Youtube SDK&lt;/span&gt;. Mit diesen Programmierbibliotheken funktioniert der Zugriff auf Youtube &amp; Co ganz einfach.&lt;br /&gt;Zum Herunterladen gibt's die &lt;span style="font-style:italic;"&gt;Google Data API&lt;/span&gt; auf &lt;a href="http://code.google.com/p/google-gdata/downloads/list"&gt;dieser&lt;/a&gt; Seite, zum Zugriff auf Youtube brauchen wir aber nur &lt;a href="http://code.google.com/p/google-gdata/downloads/detail?name=YouTube%20SDK%20%281.7.0.1%29.msi&amp;can=2&amp;q="&gt;diese&lt;/a&gt; Datei, das &lt;span style="font-style:italic;"&gt;Youtube SDK&lt;/span&gt;.&lt;br /&gt;Damit wir es später in das Projekt einbinden können, muss es installiert werden.&lt;br /&gt;Das Durchsuchen von Youtube läuft über sogenannte &lt;span style="font-style:italic;"&gt;Feeds&lt;/span&gt;.&lt;br /&gt;Feeds sind so etwas wie Inhalte einer Website in Kurzform, meistens in reinem Textformat, so können sich Leser schnell über neueste Themen informieren, außerdem lesen viele Programme diese Textdateien (Suchmaschinen benutzen sie beispielsweise zur Indizierung).&lt;br /&gt;Auch dieser Blog hat einen &lt;a href="http://csharp-tricks.blogspot.com/feeds/posts/default"&gt;Feed&lt;/a&gt;, den man sogar abonnieren kann ;-)&lt;br /&gt;Mit dem &lt;span style="font-style:italic;"&gt;Youtube SDK&lt;/span&gt; können wir Feeds mit einem C# Programm auslesen, zum Durchsuchen von Youtube benutzen wir den Feed unter &lt;a href="http://gdata.youtube.com/feeds/videos?q=Suchbegriff"&gt;http://gdata.youtube.com/feeds/videos?q=Suchbegriff&lt;/a&gt;.&lt;br /&gt;Dieser Feed wird von Youtube bereitgestellt und liefert die zu &lt;span style="font-style:italic;"&gt;Suchbegriff&lt;/span&gt; passenden Ergebnisse in textueller Form, der Feed lässt sich auch im Browser betrachten.&lt;br /&gt;&lt;br /&gt;Im Folgenden werde ich den Code erläutern, über den dieser Feed in C# ausgewertet werden kann.&lt;br /&gt;Zuerst müssen die heruntergeladenen Bibliotheken &lt;span style="font-style:italic;"&gt;Google.GData.Client.dll&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;Google.GData.Extensions.dll&lt;/span&gt; eingebunden werden.&lt;br /&gt;Diese befinden sich im &lt;span style="font-style:italic;"&gt;Redist&lt;/span&gt; Verzeichnis des Installationsordners (bei mir C:\Program Files (x86)\Google\Google YouTube SDK for .NET\Redist).&lt;br /&gt;Das Einbinden lässt sich über &lt;span style="font-style:italic;"&gt;Projekt - Verweis hinzufügen - Durchsuchen&lt;/span&gt; erledigen.&lt;br /&gt;Zum benutzen im Projekt sind dann die Codezeilen&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; Google.GData.Client; &lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; Google.GData.Extensions; &lt;/blockquote&gt;&lt;br /&gt;nötig.&lt;br /&gt;Wichtig ist auch, dass unter Projekteigenschaften - Anwendung das Zielframework auf .Net Framework 4 und nicht etwa .Net Framework 4 Client Profile gestellt wird, denn für ersteres wurden die dlls kompilliert und nur hiermit funktioniert der Code.&lt;br /&gt;&lt;br /&gt;Ich denke, der kommentierte Code ist eigentlich selbsterklärend, wesentlich hierbei ist, dass die Suchergebnisse letztendlich in Form eines Feeds (beim Programmieren als Objekt vom Typ &lt;span style="font-style:italic;"&gt;AtomFeed&lt;/span&gt;) vorliegen, wessen Einträge dann ausgelesen werden können.&lt;br /&gt;&lt;br /&gt;Das folgende Konsolenprogramm sucht auf Youtube nach dem Begriff "VLC einbinden" und gibt die ersten 10 Ergebnisse auf der Konsole aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; Google.GData.Client; &lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; Google.GData.Extensions; &lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; YoutubeToolkit&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;YoutubeQuery&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FeedQuery Abfrage = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FeedQuery(); &lt;span style="color:#008000;"&gt;// Objekt zur Handhabung von Feeds&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Abfrage.Uri = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Uri(&lt;span style="color:#A31414;"&gt;"http://gdata.youtube.com/feeds/videos?q=VLC+einbinden"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// Feed URL&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Abfrage.StartIndex = 0; &lt;span style="color:#008000;"&gt;// Index, ab welchem die Suchergebnisse angezeigt werden sollen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Abfrage.NumberToRetrieve = 10; &lt;span style="color:#008000;"&gt;// maximale Anzahl an anzuzeigenden Suchergebnissen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Service Service = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Service(); &lt;span style="color:#008000;"&gt;// Objekt zur Durchführung der Suchabfrage über das FeedQuery Objekt&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AtomFeed Feed = Service.Query(Abfrage); &lt;span style="color:#008000;"&gt;// Ergebnis der Suchabfrage als Feed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// für jedes Ergebnis den Titel des Videos ausgeben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (AtomEntry Ergebnis &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; Feed.Entries)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(Ergebnis.Title.Text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-8287280745243990328?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/8287280745243990328/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/youtube-durchsuchen.html#comment-form' title='7 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8287280745243990328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8287280745243990328'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/youtube-durchsuchen.html' title='Youtube durchsuchen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5553559433054278370</id><published>2010-12-27T15:08:00.003+01:00</published><updated>2010-12-27T15:24:16.498+01:00</updated><title type='text'>Ton ausschalten (Windows XP / Vista / 7)</title><content type='html'>Im Post &lt;a href="http://csharp-tricks.blogspot.com/2010/07/ton-ausschalten-lautstarke-einstellen.html"&gt;Ton ausschalten / Lautstärke einstellen&lt;/a&gt; stellte ich vor, wie man den PC stumm stellen und die Lautstärke anpassen kann. Die vorgestellte Methode funktioniert allerdings nur mit Windows XP.&lt;br /&gt;Deswegen zeige ich in diesem Post kurz, wie man unter Windows Vista und 7 (aber auch XP kompatibel) den PC stummschalten (&lt;span style="font-style:italic;"&gt;muten&lt;/span&gt;) kann.&lt;br /&gt;Die Lösung führt uns wieder über die &lt;span style="font-style:italic;"&gt;WinAPI&lt;/span&gt;,&lt;br /&gt;weswegen folgende using - Direktive nötig ist: &lt;span style="font-style:italic;"&gt;using System.Runtime.InteropServices;&lt;/span&gt;.&lt;br /&gt;Die benötigte &lt;span style="font-style:italic;"&gt;P/Invoke&lt;/span&gt; Methode heißt &lt;span style="font-style:italic;"&gt;SendMessageW&lt;/span&gt; und hat die Signatur &lt;span style="font-style:italic;"&gt;IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam)&lt;/span&gt;.&lt;br /&gt;Diese Funktion schickt eine Nachricht an ein bestimmtes Programm oder Fenster.&lt;br /&gt;Um den Ton am PC auszuschalten, schicken wir den richtigen Befehl an einen Systemprozess.&lt;br /&gt;Und so sieht der Code im Ganzen aus:&lt;br /&gt;Der Deklarationsteil:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color:#A31414;"&gt;"user32.dll"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;extern&lt;/span&gt; IntPtr SendMessageW(IntPtr hWnd, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; Msg, IntPtr wParam, IntPtr lParam);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; APPCOMMAND_VOLUME_MUTE = 0x80000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; WM_APPCOMMAND = 0x319;&lt;/blockquote&gt;&lt;br /&gt;Und die Funktion:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Mute()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessageW(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Handle, WM_APPCOMMAND, &lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5553559433054278370?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5553559433054278370/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/ton-ausschalten-windows-xp-vista-7.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5553559433054278370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5553559433054278370'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/ton-ausschalten-windows-xp-vista-7.html' title='Ton ausschalten (Windows XP / Vista / 7)'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4655503476906542656</id><published>2010-12-24T14:29:00.000+01:00</published><updated>2010-12-24T14:30:13.555+01:00</updated><title type='text'>Weihnachtspost</title><content type='html'>&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; Weihnachtsprogramm&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Frosty&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color:#A31414;"&gt;"{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}{17}"&lt;/span&gt;, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)70, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)114, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)111, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)104, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)101, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)32, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)87, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)101, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)105, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)104, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)110, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)97, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)99, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)104, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)116, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)101, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)110, (&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;)33);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4655503476906542656?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4655503476906542656/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/weihnachtspost.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4655503476906542656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4655503476906542656'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/weihnachtspost.html' title='Weihnachtspost'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4138090695636083688</id><published>2010-12-07T07:00:00.002+01:00</published><updated>2010-12-07T07:00:08.021+01:00</updated><title type='text'>Menüs und Untermenüs dynamisch hinzufügen</title><content type='html'>In diesem Post widme ich mich den Menüsteuerelementen in C# und zeige, wie man Menüs und Untermenüs zur Laufzeit hinzufügen kann.&lt;br /&gt;Wie ich feststellen musste, ist diese Funktion nämlich nicht ganz klar ersichtlich.&lt;br /&gt;Ich zeige hier meine Methode die über ein paar Umwege läuft, wer also direkteren Code kennt bitte Bescheid sagen.&lt;br /&gt;Ziel des Beispielprogramms soll es sein, folgende Menüstruktur zu erzeugen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_P4vFjTE5R5s/TPuApWXS8RI/AAAAAAAAADM/xXwjPCr1dPc/s1600/menu.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 281px;" src="http://1.bp.blogspot.com/_P4vFjTE5R5s/TPuApWXS8RI/AAAAAAAAADM/xXwjPCr1dPc/s320/menu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5547168813903180050" /&gt;&lt;/a&gt;&lt;br /&gt;Wir ziehen nun erstmal mit dem Designer ein Steuerelement vom Typ &lt;span style="font-style:italic;"&gt;menuStrip&lt;/span&gt; auf das Formular (kann natürlich auch dynamisch gemacht werden, siehe &lt;a href="http://csharp-tricks.blogspot.com/2010/05/steuerelemente-zur-laufzeit-hinzufugen.html"&gt;Steuerelemente zur Laufzeit hinzufügen&lt;/a&gt;).&lt;br /&gt;Nun wird lediglich oben im Formular eine noch unsichtbare Menüleiste bereitgestellt, die aber noch leer ist.&lt;br /&gt;Im Designer kann man jetzt in diese schreiben, um Menüs zu erstellen, wir beschränken uns jedoch auf den dynamischen Teil.&lt;br /&gt;Obermenüs, also Menüs auf höchster Ebene in der Menüleiste (im Beispiel "Obermenü 1" und "Obermenü 2") können über das Attribut &lt;span style="font-style:italic;"&gt;Items&lt;/span&gt; der Klasse &lt;span style="font-style:italic;"&gt;menuStrip&lt;/span&gt; bearbeitet werden.&lt;br /&gt;Folgende Codezeilen legen die 2 Obermenüs an:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;menuStrip1.Items.Add(&lt;span style="color:#A31414;"&gt;"Obermenü 1"&lt;/span&gt;);&lt;br /&gt;menuStrip1.Items.Add(&lt;span style="color:#A31414;"&gt;"Obermenü 2"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;Über einen Index (z.B. über &lt;span style="font-style:italic;"&gt;menuStrip1.Items[0]&lt;/span&gt;) können wir nun auf die Menüeinträge zugreifen, in diesen aber keine Untermenüs anlegen.&lt;br /&gt;Dafür müssen wir das Objekt explizit in ein Objekt vom Typ &lt;span style="font-style:italic;"&gt;ToolStripMenuItem&lt;/span&gt; konvertieren. Dieses hat nun die Eigenschaft &lt;span style="font-style:italic;"&gt;DropDownItems&lt;/span&gt;, über die wir Untermenüs anlegen können.&lt;br /&gt;Um beispielsweise die Untermenüs "Untermenü 1" und "Untermenü 2" zu erzeugen, führen wir folgenden Code aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"Untermenü 1"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"Untermenü 2"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;Diese Untermenüs sind nun so ersteinmal nicht mehr greifbar. Wir brauchen sie jedoch, wenn wir weitere Untermenüs anlegen wollen, die nach rechts aufklappen (im Beispiel "rechtes Untermenü 1" und "rechtes Untermenü 2").&lt;br /&gt;Deswegen speichern wir einfach beim Anlegen des Untermenü dieses in einem Objekt vom Typ &lt;span style="font-style:italic;"&gt;ToolStripMenuItem&lt;/span&gt;, z.B. so:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;ToolStripMenuItem Untermenue1 = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"Untermenü 1"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;(Vor der Zuweisung muss wieder eine explizite Typumwandlung stehen.)&lt;br /&gt;Nun haben wir über die Variable dauerhaft Zugriff auf das gewünschte Untermenü, und können diesem über &lt;span style="font-style:italic;"&gt;DropDownItems.Add()&lt;/span&gt; eigene Untermenüs hinzufügen.&lt;br /&gt;Hier zum Abschluss der komplette Beispielcode:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;menuStrip1.Items.Add(&lt;span style="color:#A31414;"&gt;"Obermenü 1"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;menuStrip1.Items.Add(&lt;span style="color:#A31414;"&gt;"Obermenü 2"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ToolStripMenuItem Untermenue1 = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"Untermenü 1"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"Untermenü 2"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Untermenue1.DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"rechtes Untermenü 1"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Untermenue1.DropDownItems.Add(&lt;span style="color:#A31414;"&gt;"rechtes Untermenü 2"&lt;/span&gt;);&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4138090695636083688?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4138090695636083688/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/menus-und-untermenus-dynamisch.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4138090695636083688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4138090695636083688'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/menus-und-untermenus-dynamisch.html' title='Menüs und Untermenüs dynamisch hinzufügen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_P4vFjTE5R5s/TPuApWXS8RI/AAAAAAAAADM/xXwjPCr1dPc/s72-c/menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4072805410365094331</id><published>2010-12-05T13:48:00.004+01:00</published><updated>2010-12-11T00:45:59.703+01:00</updated><title type='text'>Tastendruck von mehreren Tasten gleichzeitig prüfen</title><content type='html'>In den Methoden &lt;span style="font-style:italic;"&gt;KeyDown()&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;KeyPress()&lt;/span&gt;, die nahezu jedes Steuerelement implementiert, können Tastaturereignisse untersucht werden.&lt;br /&gt;Der Parameter &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; vom Typ &lt;span style="font-style:italic;"&gt;KeyEventArgs&lt;/span&gt; stellt die hierfür benötigten Methoden und Eigenschaften bereit.&lt;br /&gt;So kann z.B. über &lt;span style="font-style:italic;"&gt;e.KeyCode&lt;/span&gt; geprüft werden, welche Taste gedrückt wurde.&lt;br /&gt;Werden mehrere Tasten (gleichzeitig) gedrückt, wird für jede Taste ein Ereignis aufgerufen, was aber nicht hilft, wenn man den Druck von Tastenkombinationen abfragen möchte.&lt;br /&gt;In diesem Post beschreibe ich, wie man diese Fälle mittels der Eigenschaft &lt;span style="font-style:italic;"&gt;KeyData&lt;/span&gt; bzw. &lt;span style="font-style:italic;"&gt;Flags &lt;/span&gt; abdeckt, wobei diese Methoden nur funktionieren, wenn die Kombinationen nur aus Alt und / oder Shift und / oder Strg und / oder maximal einer anderen Taste besteht.&lt;br /&gt;Zuerst über &lt;span style="font-style:italic;"&gt;KeyData&lt;/span&gt;:&lt;br /&gt;Diese Eigenschaft wird in 4 Bytes gespeichert, die unteren beiden geben die gedrückte Taste wieder, die oberen beiden die gedrückten Funktionstasten (Alt, Shift, Strg (&lt;span style="font-style:italic;"&gt;Control&lt;/span&gt;)).&lt;br /&gt;Werden mehrere Tasten drückt, werden die Byte - Werte Oder verknüpft.&lt;br /&gt;Drückt man nun nur die Zustandstasten und maximal eine andere Taste, erhält man in &lt;span style="font-style:italic;"&gt;KeyData&lt;/span&gt; eine eindeutige Bitkombination. Es sollte allerdings klar sein, dass die Eindeutigkeit beim Drücken von mehreren "normalen" Taste nicht mehr gewährleistet ist, da die Bits sich dann überschneiden können.&lt;br /&gt;Zum Prüfen der gedrückten Kombination wird der Wert aus e.KeyData mit einer bitweisen Oder - Verknüpfung des gewünschten Wertes verglichen.&lt;br /&gt;Folgendes Beispiel beendet das Programm, wenn die Tastenkombination Strg + Shift +  Alt + "E" gedrückt wurde.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_KeyDown(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, KeyEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (e.KeyData == (Keys.Shift | Keys.Alt | Keys.Control | Keys.E))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Close();&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Das gleiche Ergebnis lässt sich aber auch erreichen, wenn man über &lt;span style="font-style:italic;"&gt;e.KeyCode&lt;/span&gt; die gedrückte Taste abfragt und zusätzlich noch die Eigenschaften &lt;span style="font-style:italic;"&gt;e.Shift&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;e.Alt&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;e.Control&lt;/span&gt; überprüft (diese Eigenschaften sind sogenannte &lt;span style="font-style:italic;"&gt;Flags&lt;/span&gt;), die angeben, ob die entsprechenden Funktionstasten gedrückt sind:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (e.KeyCode == Keys.E &amp;amp;&amp;amp; e.Shift &amp;amp;&amp;amp; e.Alt &amp;amp;&amp;amp; e.Control)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Close();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4072805410365094331?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4072805410365094331/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/tastendruck-von-mehreren-tasten.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4072805410365094331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4072805410365094331'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/tastendruck-von-mehreren-tasten.html' title='Tastendruck von mehreren Tasten gleichzeitig prüfen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-1441563671677015977</id><published>2010-12-03T14:25:00.001+01:00</published><updated>2010-12-03T14:26:36.582+01:00</updated><title type='text'>Status eines Netzwerkadapters überprüfen</title><content type='html'>Im vorigen Post wurde gezeigt, wie man prüfen kann, ob der &lt;a href="http://csharp-tricks.blogspot.com/2010/11/prufen-ob-netzwerkverbindung-besteht.html"&gt;Computer mit einem Netzwerk&lt;/a&gt; verbunden ist, ob also ein beliebiger Netzwerkadapter eine Verbindung hat.&lt;br /&gt;In diesem Post untersuchen wir den Status von nur einer Netzwerkschnittstelle, und das etwas genauer. Wir möchten nun nicht mehr nur zwischen "verbunden" und "nicht verbunden" unterscheiden, sondern mehr Informationen erhalten.&lt;br /&gt;Wir benutzen wieder die Klasse &lt;span style="font-style:italic;"&gt;System.Net.NetworkInformation&lt;/span&gt;, fragen aber dieses Mal die Eigenschaft &lt;span style="font-style:italic;"&gt;OperationalStatus&lt;/span&gt; ab.&lt;br /&gt;Diese kann folgende Werte annehmen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Dormant&lt;/i&gt; - Die Schnittstelle wartet auf ein externes Ereignis, sie kann keine Daten übertragen.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Down&lt;/i&gt; - Keine Verbindung.&lt;/li&gt;&lt;li&gt;&lt;i&gt;LowerLayerDown&lt;/i&gt; - Die Schnittstelle kann keine Daten übertragen, da sie auf "tieferliegende" Schnittstellen zugreift und mindestens eine dieser nicht in Betrieb ist.&lt;/li&gt;&lt;li&gt;&lt;i&gt;NotPresent&lt;/i&gt; - Nicht funktionsfähig, meistens wegen einem Hardwaredefekt.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Testing&lt;/i&gt; - Die Schnittstelle führt Tests aus.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Unknown&lt;/i&gt; - Unbekannter Status.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Up&lt;/i&gt; - Die Schnittstelle ist in Betrieb.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ein kleines Beispiel, es listet alle Netzwerkverbindungen auf, die in Betrieb sind:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (System.Net.NetworkInformation.NetworkInterface n &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (n.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(n.Name + &lt;span style="color:#A31414;"&gt;" ist Up."&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-1441563671677015977?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/1441563671677015977/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/status-eines-netzwerkadapters.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1441563671677015977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1441563671677015977'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/status-eines-netzwerkadapters.html' title='Status eines Netzwerkadapters überprüfen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-2152054040802535931</id><published>2010-12-03T14:13:00.004+01:00</published><updated>2010-12-03T14:27:13.533+01:00</updated><title type='text'>Verfügbare Netzwerkadapter auflisten und weitere Informationen anzeigen</title><content type='html'>Wie im &lt;a href="http://csharp-tricks.blogspot.com/2010/11/prufen-ob-netzwerkverbindung-besteht.html"&gt;vorigen Post&lt;/a&gt; benutzen wir wieder die Klasse &lt;span style="font-style:italic;"&gt;System.Net.NetworkInformation&lt;/span&gt;. Die Methode &lt;span style="font-style:italic;"&gt;NetworkInterface.GetAllNetworkInterfaces()&lt;/span&gt; liefert ein Array vom Typ &lt;span style="font-style:italic;"&gt;System.Net.NetworkInformation.NetworkInterface&lt;/span&gt; zurück, wobei jeder Eintrag eine Netzwerkschnittstelle bzw. einen Netzwerkadapter repräsentiert.&lt;br /&gt;Über dieses Array können wir nun iterieren und so alle verfügbaren Netzwerkadapter auflisten.&lt;br /&gt;Das folgende Beispiel gibt den Namen sowie den Status (wird im &lt;a href="http://csharp-tricks.blogspot.com/2010/12/status-eines-netzwerkadapters.html"&gt;nächsten Post&lt;/a&gt; näher erläutert) jedes einzelnen aktivierten Netzwerkadapters aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (System.Net.NetworkInformation.NetworkInterface n &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color:#A31414;"&gt;"Name: "&lt;/span&gt; + n.Name + &lt;span style="color:#A31414;"&gt;" Status: "&lt;/span&gt; + n.OperationalStatus.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-2152054040802535931?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/2152054040802535931/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/verfugbare-netzwerkadapter-auflisten.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/2152054040802535931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/2152054040802535931'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/12/verfugbare-netzwerkadapter-auflisten.html' title='Verfügbare Netzwerkadapter auflisten und weitere Informationen anzeigen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4154667376341506446</id><published>2010-11-28T14:12:00.005+01:00</published><updated>2010-12-03T14:12:23.301+01:00</updated><title type='text'>Prüfen ob Netzwerkverbindung besteht</title><content type='html'>Wir benutzen die Klasse &lt;span style="font-style:italic;"&gt;System.Net.NetworkInformation.NetworkInterface&lt;/span&gt; um zu prüfen, ob der Computer eine Verbindung zu einem Netzwerk hat.&lt;br /&gt;Die hierzu benötigte Methode heißt &lt;span style="font-style:italic;"&gt;GetIsNetworkAvailable()&lt;/span&gt;. Sie prüft nur, ob der Computer sich über einen beliebigen Adapter in ein Netzwerk eingewählt halt, nicht, ob dieses auch funktioniert oder eine Verbindung zum Internet besteht.&lt;br /&gt;Folgendes Codebeispiel prüft die Konnektivität:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; NetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4154667376341506446?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4154667376341506446/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/prufen-ob-netzwerkverbindung-besteht.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4154667376341506446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4154667376341506446'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/prufen-ob-netzwerkverbindung-besteht.html' title='Prüfen ob Netzwerkverbindung besteht'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5140937874330039237</id><published>2010-11-25T11:37:00.002+01:00</published><updated>2010-11-25T11:53:31.029+01:00</updated><title type='text'>Assertions</title><content type='html'>&lt;span style="font-style:italic;"&gt;Assertions&lt;/span&gt; sind eine Methode zur Kontrolle der Programmkorrektheit.&lt;br /&gt;Sie stellen eine Bedindung dar, die bei Verletzung eine Fehlermeldung ausgibt.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Assertions&lt;/span&gt; stehen meistens vor Programmbereichen, die ohne Erfülltsein der Bedingung nicht funktionieren würden. Wird eine &lt;span style="font-style:italic;"&gt;Assertion&lt;/span&gt; geworfen, weiß der Programmierer, dass er in diesem Bereich den Fehler abzufangen hat.&lt;br /&gt;Der Ausdruck &lt;span style="font-style:italic;"&gt;System.Diagnostics.Debug.Assert()&lt;/span&gt; kann in der Debug - Konfiguration verwendet werden, &lt;span style="font-style:italic;"&gt;System.Diagnostics.Trace.Assert()&lt;/span&gt; in der Release - Version.&lt;br /&gt;Als Beispiel eine Methode zur Division, die beim Versuch, durch 0 zu teilen, mittels &lt;span style="font-style:italic;"&gt;Assert()&lt;/span&gt; dazwischengeht:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; divide(&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; divident, &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; divisor)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Diagnostics.Debug.Assert(divisor != 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; (divident / divisor);&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5140937874330039237?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5140937874330039237/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/assertions.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5140937874330039237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5140937874330039237'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/assertions.html' title='Assertions'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-7311502144586253211</id><published>2010-11-23T15:53:00.002+01:00</published><updated>2010-11-23T16:07:49.422+01:00</updated><title type='text'>String - Repräsentation einer Klasse durch Überladen von ToString()</title><content type='html'>Alle Klassen und Strukturen in C# erben implizit von der Überklasse &lt;span style="font-style:italic;"&gt;Object&lt;/span&gt;.&lt;br /&gt;Diese stellt einige grundlegende Methoden wie &lt;span style="font-style:italic;"&gt;Equals()&lt;/span&gt; (prüft auf Gleichheit) und &lt;span style="font-style:italic;"&gt;ToString()&lt;/span&gt; (stellt die Klasse als Zeichenkette dar) zur Verfügung.&lt;br /&gt;Alle Klassen und Strukturen implementieren somit standardmäßig diese Methoden.&lt;br /&gt;Jedem wird die Schreibweise &lt;span style="font-style:italic;"&gt;Console.WriteLine(x.ToString());&lt;/span&gt; bekannt sein, wobei &lt;span style="font-style:italic;"&gt;x&lt;/span&gt; beispielsweise eine &lt;span style="font-style:italic;"&gt;Integer&lt;/span&gt; - Variable ist. Auch diese Klasse besitzt die Methode &lt;span style="font-style:italic;"&gt;ToString()&lt;/span&gt;, sie gibt den Wert der Ganzzahl als &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; aus.&lt;br /&gt;Vom Programmierer angelegte Klassen erben auch von &lt;span style="font-style:italic;"&gt;Object&lt;/span&gt;, haben also somit auch die Methode &lt;span style="font-style:italic;"&gt;ToString()&lt;/span&gt; vordefiniert, hier liefert diese aber wahrscheinlich nicht das gewünschte Ergebnis.&lt;br /&gt;Der Compiler druckt einfach den Typnamen der Klasse als Zeichenkette aus, woher sollte er auch wissen, wie der Programmierer eine Instanz der Klasse als Zeichenkette darstellen möchte.&lt;br /&gt;Deswegen bietet es sich an, bei eigenen Klassen die Methode &lt;span style="font-style:italic;"&gt;ToString()&lt;/span&gt; zu &lt;span style="font-style:italic;"&gt;überschreiben&lt;/span&gt;. Beim Überschreiben (engl. &lt;span style="font-style:italic;"&gt;overriding&lt;/span&gt;) von Methoden wird in der Kindsklasse eine Methode mit der gleichen Signatur (d.h. Name und Parameterliste gleich) wie eine Methode aus der Vaterklasse angelegt.&lt;br /&gt;Wird nun die Methode der Kindsklasse aufgerufen, wird der Aufruf nicht mehr auf die Methode der Basisklasse weitergeleitet, sondern direkt in der Kindsklasse verarbeitet.&lt;br /&gt;Das folgende Konsolenprogramm implementiert eine kleine Klasse &lt;span style="font-style:italic;"&gt;Employee&lt;/span&gt;, in welcher die Methode &lt;span style="font-style:italic;"&gt;ToString()&lt;/span&gt; überladen wird.&lt;br /&gt;In der modifizierten Version werden Name und Gehalt des Mitarbeiters ausgegeben:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Employee TestEmployee = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Employee(&lt;span style="color:#A31414;"&gt;"Hans Meier"&lt;/span&gt;, 1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(TestEmployee.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Employee&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; Salary;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Employee(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; name, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; salary)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Salary = salary;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;override&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#A31414;"&gt;"Name: "&lt;/span&gt; + Name + &lt;span style="color:#A31414;"&gt;", Gehalt: "&lt;/span&gt; + Salary + &lt;span style="color:#A31414;"&gt;"."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-7311502144586253211?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/7311502144586253211/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/string-reprasentation-einer-klasse.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7311502144586253211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7311502144586253211'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/string-reprasentation-einer-klasse.html' title='String - Repräsentation einer Klasse durch Überladen von ToString()'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-8917797689150472014</id><published>2010-11-21T12:32:00.004+01:00</published><updated>2011-05-14T01:03:03.324+02:00</updated><title type='text'>Ein Quine mit C#</title><content type='html'>Ein &lt;span style="font-style:italic;"&gt;Quine&lt;/span&gt; ist ein Programm, welches seinen kompletten eigenen Quellcode als Ausgabe ausgibt.&lt;br /&gt;Lautet der Quellcode also beispielsweise&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Quine&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(&lt;span style="color:#A31414;"&gt;"Dies ist (noch) kein Quine."&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;müsste das Programm genau diesen Text ausgeben.&lt;br /&gt;Je nachdem, wie erfahren man mit Problemen aus diesem Bereich ist, wird einem die Aufgabe, ein &lt;span style="font-style:italic;"&gt;Quine&lt;/span&gt; zu schreiben, vielleicht als einfach, schwer oder sogar unmöglich vorkommen.&lt;br /&gt;(Für theoretisch interessierte: In allen "höheren" Programmiersprachen, also C, C#, Java etc. ist sogar garantiert, dass &lt;span style="font-style:italic;"&gt;Quines&lt;/span&gt; existieren müssen. Denn all diese Sprachen sind &lt;span style="font-style:italic;"&gt;Turing - vollständig&lt;/span&gt;, und in &lt;span style="font-style:italic;"&gt;Turing -  vollständigen&lt;/span&gt; Sprachen lässt sich ein &lt;span style="font-style:italic;"&gt;Quine&lt;/span&gt; realisieren.)&lt;br /&gt;Geht man ganz naiv an die Sache ran, könnte man vielleicht vermuten, das Problem wäre ganz schnell gelöst.&lt;br /&gt;Man druckt zuerst den Code bis zur Zeile mit&lt;span style="font-style:italic;"&gt; WriteLine()&lt;/span&gt;, dann diese Zeile und schließlich den Rest bis zur abschließenden Klammer.&lt;br /&gt;Aber Moment! Die Aufgabenstellung besagt, dass der komplette Quellcode gedruckt werden soll, es müssen also auch alle &lt;span style="font-style:italic;"&gt;WriteLine()&lt;/span&gt; Anweisungen gedruckt werden.&lt;br /&gt;Schreibt man beispielsweise&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; test = &lt;span style="color:#A31414;"&gt;"abc"&lt;/span&gt;;&lt;/blockquote&gt; und gibt diese Zeile dann mittels &lt;span style="font-style:italic;"&gt;WriteLine()&lt;/span&gt; aus&lt;br /&gt;&lt;blockquote&gt;WriteLine(&lt;span style="color:#A31414;"&gt;"string test = \"abc\";"&lt;/span&gt;);&lt;/blockquote&gt;, muss im nächsten Schritt dann auch diese Zeile ausgedruckt werden.&lt;br /&gt;Damit so keine Endlosrekursion entsteht, besteht der Trick darin, den auszugebenden Code in einem String zu speichern und dann nur diesen String auszugeben.&lt;br /&gt;Weiterhin wird noch ausgenutzt, dass in C# in der &lt;span style="font-style:italic;"&gt;WriteLine()&lt;/span&gt; - Methode Platzhalter benutzt werden können, welche dann später ersetzt werden.&lt;br /&gt;Ich zeige jetzt einfach den Code eines von mir geschriebenen funktionierenden Quines, die abstrakten Forderungen von oben werden so vielleicht am besten deutlich:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Quine&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; s = &lt;span style="color:#A31414;"&gt;"class Quine {3} {0} {3} static void Main(string[] args) {3} {0} {3} string s = {2}{1}{2}; {3} System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125)); {3} {4} {3} {4}"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-8917797689150472014?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/8917797689150472014/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/ein-quine-mit-c.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8917797689150472014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8917797689150472014'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/ein-quine-mit-c.html' title='Ein Quine mit C#'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4910425159560982876</id><published>2010-11-13T18:23:00.003+01:00</published><updated>2010-11-13T18:53:31.770+01:00</updated><title type='text'>In das Windows Ereignisprotokoll schreiben</title><content type='html'>Im &lt;span style="font-style:italic;"&gt;Windows Ereignisprotokoll&lt;/span&gt; zeichnet Windows viele systemrelevante Informationen (z.B. das Starten / Beenden von Diensten, um nur eins von unzähligen Anwendungsgebieten zu nennen) auf.&lt;br /&gt;Mit C# können wir in dieses Protokoll ganz leicht eigene Einträge über die Klasse &lt;span style="font-style:italic;"&gt;System.Diagnostics.EventLog&lt;/span&gt; schreiben, um beispielsweise den Programmfluss zu überwachen.&lt;br /&gt;Zuerst müssen wir hierfür (sofern noch nicht vorhanden) eine neue &lt;span style="font-style:italic;"&gt;Quelle&lt;/span&gt; im Ereignisprotokoll anlegen.&lt;br /&gt;Die Quelle gibt an, durch welche Anwendung etc. der Eintrag geschrieben wurde.&lt;br /&gt;Gibt es noch keine Einträge von der Anwendung, wird die Quelle also neu angelegt, müssen wir spezifizieren, zu welcher Kategorie das Programm zählt. Im Ereignisprotokoll gibt es beispielsweise die Kategorien "Anwendung", "Sicherheit", "Installation" etc.&lt;br /&gt;Das letztendliche Schreiben des Ereignisses führt die Methode &lt;span style="font-style:italic;"&gt;WriteEntry()&lt;/span&gt; durch. Diese erwartet als 1. Parameter die Quelle, als 2. die Kategorie und optional als 3. den Typ des Ereignisses (z.B. Warnung, Information, Fehler ...).&lt;br /&gt;Zum Schreiben in das Ereignisprotokoll wird das Programm wahrscheinlich (unter Windows Vista und 7) Administratorrechte benötigen, wie man die eigene Anwendung damit ausstattet könnt ihr &lt;a href="http://csharp-tricks.blogspot.com/2010/05/c-anwendung-mit-administratorrechten.html"&gt;hier&lt;/a&gt; lesen.&lt;br /&gt;Das folgende Codebeispiel schreibt einen kurzen Informationstext in die Windows Ereignisanzeige (&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Diagnostics; wird vorrausgesetzt):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Source;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; LogType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; LogEvent;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Source = &lt;span style="color:#A31414;"&gt;"Ereignisprotokoll C# Demo"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogType = &lt;span style="color:#A31414;"&gt;"Application"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogEvent = &lt;span style="color:#A31414;"&gt;"Diesen C# Blog finde ich super."&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (!EventLog.SourceExists(Source))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EventLog.CreateEventSource(Source, LogType);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EventLog.WriteEntry(Source, LogEvent, EventLogEntryType.Information);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4910425159560982876?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4910425159560982876/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/in-das-windows-ereignisprotokoll.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4910425159560982876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4910425159560982876'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/in-das-windows-ereignisprotokoll.html' title='In das Windows Ereignisprotokoll schreiben'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5014031725076184787</id><published>2010-11-08T18:00:00.000+01:00</published><updated>2010-11-08T18:06:38.440+01:00</updated><title type='text'>Herunterfahren von Windows verhindern / verzögern</title><content type='html'>Im vorigen Post wurde gezeigt, wie man erkennen kann, &lt;a href="http://csharp-tricks.blogspot.com/2010/11/c-erkennen-ob-system-heruntergefahren.html"&gt;ob der PC heruntergefahren wird&lt;/a&gt;.&lt;br /&gt;In diesem Post geht es darum, wie man das Herunterfahren abbricht bzw. verzögert um z.B. vorher Daten zu sichern.&lt;br /&gt;Im vorigen Post wurde die Methode &lt;span style="font-style:italic;"&gt;FormClosing()&lt;/span&gt; benutzt, in welcher beim Schließen des Formulars der Beendigungsgrund abgefragt wurde.&lt;br /&gt;In dieser Methode können wir nun ebenfalls über den Parameter &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; das Herunterfahren einfach unterbinden, in dem wir&lt;span style="font-style:italic;"&gt; e.Cancel = true&lt;/span&gt; setzen.&lt;br /&gt;Das Herunterfahren des Rechners wird damit nicht vollständig abgebrochen, sondern nur solange verzögert, wie das Programm läuft - nun hat die Anwendung beispielsweise Zeit, ungesicherte Daten zu speichern.&lt;br /&gt;In Windows Vista und 7 erscheint dabei ein Wartungsfenster mit dem Hinweis: "Folgendes Programm verhindert das Herunterfahren des Computers."&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_FormClosing(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, FormClosingEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (e.CloseReason == CloseReason.WindowsShutDown)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Cancel = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Eine andere Möglichkeit, das Herunterfahren von Windows zu verzögern, besteht in der Verwendung des &lt;span style="font-style:italic;"&gt;Microsoft.Win32.SystemEvents.SessionEnding&lt;/span&gt; Ereignisses, welches bei Herunterfahren des Systems eintritt.&lt;br /&gt;Diesem Ereignis kann man wie anderen Ereignissen (z.B. Klick auf einen Button) eine Methode zuweisen, die aufgerufen wird, wenn es eintritt.&lt;br /&gt;Folgender Codeausschnitt zeigt ein Beispiel unter Verwendung des Systemereignisses:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.Win32.SystemEvents.SessionEnding += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Microsoft.Win32.SessionEndingEventHandler(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.WinShutdown);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; WinShutdown(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, Microsoft.Win32.SessionEndingEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Cancel = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5014031725076184787?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5014031725076184787/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/herunterfahren-von-windows-verhindern.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5014031725076184787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5014031725076184787'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/herunterfahren-von-windows-verhindern.html' title='Herunterfahren von Windows verhindern / verzögern'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5731323553202299848</id><published>2010-11-06T16:21:00.004+01:00</published><updated>2010-11-08T18:07:54.340+01:00</updated><title type='text'>C# erkennen ob System heruntergefahren wird</title><content type='html'>Eine häufig durchgeführte Suchanfrage, bei welcher Surfer auf diesem Blog landeten, war die Frage, wie man feststellen kann, ob der PC gerade heruntergefahren wird.&lt;br /&gt;Deswegen gibt es die Lösung jetzt hier als Post (warum siehe &lt;a href="http://csharp-tricks.blogspot.com/2010/11/posts-fur-haufige-suchbegriffe.html"&gt;hier&lt;/a&gt;).&lt;br /&gt;Wird das System heruntergefahren, werden logischerweise alle laufenden Prorgamme beendet. Das können wir ausnutzen, in dem wir in der Methode &lt;span style="font-style:italic;"&gt;FormClosing()&lt;/span&gt; des Hauptformulars, welche aufgerufen wird, wenn das Formular geschlossen wird, den Grund des Schließens abfragen.&lt;br /&gt;Dieser kann über die Eigenschaft &lt;span style="font-style:italic;"&gt;CloseReason&lt;/span&gt; des Parameters &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; ermittelt werden.&lt;br /&gt;Im Falle des Herunterfahrens lautet dieser Grund &lt;span style="font-style:italic;"&gt;CloseReason.WindowsShutDown&lt;/span&gt;.&lt;br /&gt;Der folgende Codeausschnitt aus einer Windows Forms-Anwendung implementiert diese Möglichkeit und gibt eine Meldung aus, wenn der PC heruntergefahren wird:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_FormClosing(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, FormClosingEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (e.CloseReason == CloseReason.WindowsShutDown)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(&lt;span style="color:#A31414;"&gt;"PC wird heruntergefahren."&lt;/span&gt;);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Die Verwendung des Ereignisses &lt;span style="font-style:italic;"&gt;Microsoft.Win32.SystemEvents.SessionEnding&lt;/span&gt;, welches nur eintritt wenn der PC heruntergefahren wird, wird im &lt;a href="http://csharp-tricks.blogspot.com/2010/11/herunterfahren-von-windows-verhindern.html"&gt;nächsten Post&lt;/a&gt; kurz erwähnt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5731323553202299848?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5731323553202299848/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-erkennen-ob-system-heruntergefahren.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5731323553202299848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5731323553202299848'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-erkennen-ob-system-heruntergefahren.html' title='C# erkennen ob System heruntergefahren wird'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-1620679974304102583</id><published>2010-11-05T07:46:00.003+01:00</published><updated>2010-11-05T07:52:04.956+01:00</updated><title type='text'>C# .txt Datei bereits vorhanden</title><content type='html'>In einem vorigen Post wurde allgemein beschrieben, wie man prüfen kann, ob &lt;a href="http://csharp-tricks.blogspot.com/2010/07/prufen-ob-datei-ordner-bereits.html"&gt;eine Datei / ein Ordner bereits vorhanden ist&lt;/a&gt;.&lt;br /&gt;Im Rahmen der &lt;a href="http://csharp-tricks.blogspot.com/2010/11/posts-fur-haufige-suchbegriffe.html"&gt;"Posts für häufige Suchbegriffe"&lt;/a&gt; zeige ich in diesem Post explizit den Code zum Prüfen, ob eine Textdatei bereits vorhanden ist.&lt;br /&gt;Wer den Code nicht versteht sei auf den allgemeineren Post verwiesen, ich poste hier nur kurz die Lösung:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; test = TxtFileExisting(&lt;span style="color:#A31414;"&gt;@"C:\Users\User\Desktop\c#"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; TxtFileExisting(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; TxtDateiExistiert = System.IO.File.Exists(path + &lt;span style="color:#A31414;"&gt;".txt"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; TxtDateiExistiert;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;br /&gt;Aus der Methode &lt;span style="font-style:italic;"&gt;Form_Load()&lt;/span&gt; wird die Methode &lt;span style="font-style:italic;"&gt;TxtFileExisting()&lt;/span&gt; mit dem Pfad zur prüfenden Datei (ohne Endung) aufgerufen.&lt;br /&gt;In dieser Methode wird an den Pfad ".txt" angehängt und mittels &lt;span style="font-style:italic;"&gt;System.IO.File.Exists()&lt;/span&gt; geprüft, ob die entsprechende Textdatei existiert. Falls ja, wird &lt;span style="font-style:italic;"&gt;true&lt;/span&gt; zurückgegeben, andernfalls &lt;span style="font-style:italic;"&gt;false&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-1620679974304102583?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/1620679974304102583/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-txt-datei-bereits-vorhanden.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1620679974304102583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1620679974304102583'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-txt-datei-bereits-vorhanden.html' title='C# .txt Datei bereits vorhanden'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-3843863486460643173</id><published>2010-11-02T11:16:00.006+01:00</published><updated>2010-11-03T00:12:53.439+01:00</updated><title type='text'>C# Textdatei zufällige Zeile auslesen</title><content type='html'>In diesem Post möchte ich zeigen, wie man mit C# eine zufällige Zeile aus einer Textdatei liest.&lt;br /&gt;(Diesen Post schreibe ich im Rahmen der &lt;a href="http://csharp-tricks.blogspot.com/2010/11/posts-fur-haufige-suchbegriffe.html"&gt;Posts für häufige Suchbegriffe&lt;/a&gt;.)&lt;br /&gt;Leider gibt es in C# keine direkte Möglichkeit, auf eine bestimmte Zeile einer Textdatei zuzugreifen.&lt;br /&gt;Denn die Inhalte von Dateien werden als Folgen von Bits gespeichert, verschiedene Zeilen sind erst in einer höheren Abstraktionsebene sichtbar.&lt;br /&gt;Um nun eine zufällige Zeile aus einer Textdatei auszulesen, lesen wir zuerst alle Zeilen ein und geben dann eine zufällige Zeile aus.&lt;br /&gt;Das Auslesen der Textdatei erfolgt über die Klasse &lt;span style="font-style:italic;"&gt;StreamReader&lt;/span&gt;, die Methode &lt;span style="font-style:italic;"&gt;ReadToEnd()&lt;/span&gt; liest den kompletten Inhalt der Textdatei aus und gibt diesen als &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; zurück.&lt;br /&gt;Diesen &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; kann man mit der Methode &lt;span style="font-style:italic;"&gt;Split()&lt;/span&gt; aufteilen, als Trennzeichen übergeben wir &lt;span style="font-style:italic;"&gt;Environment.NewLine&lt;/span&gt;.&lt;br /&gt;Diese Konstante gibt das auf dem aktuellen System verwendete Trennsymbol für Zeilenumbrüche zurück.&lt;br /&gt;Unter Windows ist dieses Symbol "\r\n", da dieses quasi aus 2 verschiedenen Symbolen besteht wird der String zuoft gesplittet, jede 2. Zeile ist leer und wir setzen die Option &lt;span style="font-style:italic;"&gt;StringSplitOptions.RemoveEmptyEntries&lt;/span&gt;&lt;br /&gt;um diese leeren Zeilen zu löschen.&lt;br /&gt;&lt;br /&gt;Zur Erzeugung von Zufallszahlen, was zur Rückgabe einer zufälligen Zeile benötigt wird, habe ich &lt;a href="http://csharp-tricks.blogspot.com/2010/06/zufallszahlen-erzeugen.html"&gt;diesen Post&lt;/a&gt; geschrieben.&lt;br /&gt;&lt;br /&gt;Und nun der Code für eine fertige Funktion, welche den Pfad zu der zu lesenden Textdatei als Parameter entgegen nimmt und als Ergebnis eine zufällige Zeile der Textdatei als String zurückgibt (oben im Projekt muss die Anweisung &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.IO; eingebunden sein):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ReadRandomTextLine(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; path)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader sr = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; StreamReader(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(path, FileMode.Open)); &lt;span style="color:#008000;"&gt;// StreamReader zum Lesen der Datei im Pfad path&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] Lines = sr.ReadToEnd().Split(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); &lt;span style="color:#008000;"&gt;// kompletten Inhalt der Datei auslesen und nach Zeilen splitten&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random rnd = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Random(); &lt;span style="color:#008000;"&gt;// den Zufallsgenerator initialisieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Lines[rnd.Next(Lines.Length)]; &lt;span style="color:#008000;"&gt;// eine zufällige Zeile zurückgeben&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-3843863486460643173?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/3843863486460643173/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-textdatei-zufallige-zeile-auslesen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3843863486460643173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/3843863486460643173'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/c-textdatei-zufallige-zeile-auslesen.html' title='C# Textdatei zufällige Zeile auslesen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-8541110829136121500</id><published>2010-11-02T10:17:00.004+01:00</published><updated>2010-11-05T07:52:58.578+01:00</updated><title type='text'>Posts für häufige Suchbegriffe</title><content type='html'>Ich benutze Google Analytics zur Analyse des Besucherverhaltens dieses Blogs. Mit Analytics kann man u.a. sehen, wie oft die eigene Seite für welche Suchbegriffe in den Ergebnisseiten von Suchmaschinen auftaucht und wie oft sie angeklickt wird.&lt;br /&gt;In diesen Statistiken finden sich einige interessante Begriffe betreffend C# Fragen, die häufig gesucht werden. In den nächsten Tagen werde ich Posts zu genau den gesuchten Themen veröffentlichen. Erfahrenen C# Nutzern werden sie vielleicht komisch oder überflüssig vorkommen, aber ich hoffe, einige Programmierer finden genau die Lösung ihres Problems und ich erhalte nebenbei noch den ein oder anderen Besucher ;-)&lt;br /&gt;&lt;br /&gt;Liste der Posts aus dieser Reihe:&lt;br /&gt;&lt;a href="http://csharp-tricks.blogspot.com/2010/11/c-textdatei-zufallige-zeile-auslesen.html"&gt;C# Textdatei zufällige Zeile auslesen&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csharp-tricks.blogspot.com/2010/11/c-txt-datei-bereits-vorhanden.html"&gt;CSharp txt Datei bereits vorhanden&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-8541110829136121500?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/8541110829136121500/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/posts-fur-haufige-suchbegriffe.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8541110829136121500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8541110829136121500'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/11/posts-fur-haufige-suchbegriffe.html' title='Posts für häufige Suchbegriffe'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-7220391936274247261</id><published>2010-10-30T13:32:00.000+02:00</published><updated>2010-10-30T13:32:07.191+02:00</updated><title type='text'>Allgemeiner Fehler in GDI+</title><content type='html'>Die Fehlermeldung "Allgemeiner Fehler in GDI+." ist ganz schön fies in C# - sie tritt sporadisch auf und die Ursache ist oft auf den ersten Blick nicht ersichtlich. Deswegen werde ich diesen Post der Fehlermeldung und ihren Ursachen widmen und die meiner Meinung nach 2 häufigsten Quellen des Grafikfehlers beschreiben.&lt;br /&gt;Der oben genannte Fehler kann auftreten wenn ein Bild (&lt;em&gt;Image&lt;/em&gt;) über die Methode &lt;em&gt;Save() &lt;/em&gt;in einen nicht existierenden Pfad gespeichert werden soll.&lt;br /&gt;Folgender Code versucht, den Inhalt der &lt;em&gt;pictureBox&lt;/em&gt; als Bild zu speichern und wirft dabei die Fehlermeldung, sofern der angegebene Pfad nicht vorhanden ist:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;pictureBox1.Image.Save(&lt;span style="color:#A31414;"&gt;"C:\\NichtExistierenderPfad\\test.jpg"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;Beim Laden eines Bildes führt ein falscher Pfad dagegen zu einer &lt;em&gt;FileNotFoundException&lt;/em&gt;.&lt;br /&gt;Eine weitere sehr häufige Ursache des leidigen Fehlers "Allgemeiner Fehler in GDI+." ist die Nichtfreigebung eines Bildobjekts.&lt;br /&gt;Lädt man ein Bild z.B. über die Methode &lt;em&gt;Image.FromFile()&lt;/em&gt;, bleibt dieses solange im Speicher geöffet, bis es nicht freigegeben wird. Insbesondere ist vor dem Freigeben kein Speichern über &lt;em&gt;Save()&lt;/em&gt; möglich.&lt;br /&gt;Das folgende Codebeispiel lädt ein Bild in die &lt;em&gt;pictureBox&lt;/em&gt; und versucht dann, dieses zu speichern - doch es tritt der "Allgemeiner Fehler in GDI+." Fehler auf, da das Bild nicht freigegeben wurde.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;pictureBox1.Image = Image.FromFile(&lt;span style="color:#A31414;"&gt;"C:\\test\\test1.jpg"&lt;/span&gt;);&lt;br /&gt;pictureBox1.Image.Save(&lt;span style="color:#A31414;"&gt;"C:\\test\\test2.jpg"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;Das Bild muss zur korrekten Funktionsweise des Codes intern "umkopiert" werden:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;pictureBox1.Image = Image.FromFile(&lt;span style="color:#A31414;"&gt;"C:\\test\\test1.jpg"&lt;/span&gt;);&lt;br /&gt;Image Copy = pictureBox1.Image;&lt;br /&gt;Copy.Save(&lt;span style="color:#A31414;"&gt;"C:\\test\\test2.jpg"&lt;/span&gt;);&lt;/blockquote&gt;&lt;br /&gt;Ich hoffe, der Post hat die grundlegende Problematik dieses Fehlers deutlich gemacht, über weitere Ursachen, Besonderheiten etc. bin ich jederzeit dankbar!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-7220391936274247261?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/7220391936274247261/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/allgemeiner-fehler-in-gdi.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7220391936274247261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/7220391936274247261'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/allgemeiner-fehler-in-gdi.html' title='Allgemeiner Fehler in GDI+'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-1044117133179167915</id><published>2010-10-28T18:53:00.002+02:00</published><updated>2010-10-28T19:07:51.221+02:00</updated><title type='text'>Bild in byte - Array speichern</title><content type='html'>Um mit C# ein Bild (&lt;span style="font-style:italic;"&gt;Image&lt;/span&gt;) in ein &lt;span style="font-style:italic;"&gt;byte&lt;/span&gt; - Array zu konvertieren, speichern wir das Bild zuerst in einen &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt; und kopieren den Inhalt dieses &lt;span style="font-style:italic;"&gt;Streams&lt;/span&gt; dann in ein byte - Array.&lt;br /&gt;Prinzipiell kann jeder Streamtyp dazu verwendet werden, am einfachsten ist jedoch die Verwendung eines &lt;span style="font-style:italic;"&gt;MemoryStreams&lt;/span&gt;, welcher lediglich temporär Daten in den Arbeitsspeicher schreibt bzw. daraus liest.&lt;br /&gt;Ein Bild vom Typ &lt;span style="font-style:italic;"&gt;Image&lt;/span&gt; kann über die Methode &lt;span style="font-style:italic;"&gt;Save()&lt;/span&gt; in den als 1. Parameter spezifizierten &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt; geschrieben werden, als 2. Parameter kann das Format angegeben werden, in welchem das Bild gespeichert werden soll (also z.B. Gif oder Bmp).&lt;br /&gt;Der folgende Beispielcode speichert den Inhalt der &lt;span style="font-style:italic;"&gt;pictureBox&lt;/span&gt; auf dem Formular in einem &lt;span style="font-style:italic;"&gt;byte&lt;/span&gt; - Array:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream TempStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ImageInBytes;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pictureBox1.Image.Save(TempStream, System.Drawing.Imaging.ImageFormat.Gif);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageInBytes = TempStream.ToArray();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-1044117133179167915?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/1044117133179167915/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/bild-in-byte-array-speichern.html#comment-form' title='7 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1044117133179167915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1044117133179167915'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/bild-in-byte-array-speichern.html' title='Bild in byte - Array speichern'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-1000317142079457921</id><published>2010-10-26T17:21:00.006+02:00</published><updated>2010-10-26T17:38:11.492+02:00</updated><title type='text'>Code mit #region gliedern</title><content type='html'>Bei größeren Codeprojekten kann die Codeansicht schnell unübersichtlich werden, sind alle Methoden etc. erweitert ist ganz schön Scrollarbeit nötig, um von oben im Quellcode bis nach unten zu kommen.&lt;br /&gt;Doch Codeblöcke lassen sich mit C# auch ganz einfach gliedern, und zwar mit dem Schlüsselwort &lt;span style="font-style:italic;"&gt;#region&lt;/span&gt;.&lt;br /&gt;Dieses Schlüsselwort beginnt einen Block welcher durch &lt;span style="font-style:italic;"&gt;#endregion&lt;/span&gt; beendet werden muss.&lt;br /&gt;Die definierten Regionen können dann z.B. wie Methoden ein- oder ausgeklappt werden, die folgenden 2 Bilder zeigen dies:&lt;br /&gt;&lt;br /&gt;"Normal" (ausgeklappt):&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_P4vFjTE5R5s/TMb1LsGYKrI/AAAAAAAAAC8/kwFC9CYAEQw/s1600/region1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 255px; height: 147px;" src="http://3.bp.blogspot.com/_P4vFjTE5R5s/TMb1LsGYKrI/AAAAAAAAAC8/kwFC9CYAEQw/s320/region1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5532378773436508850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eingeklappt:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_P4vFjTE5R5s/TMb1ZeZuZmI/AAAAAAAAADE/Cg28l-uQV0A/s1600/region2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 191px; height: 52px;" src="http://4.bp.blogspot.com/_P4vFjTE5R5s/TMb1ZeZuZmI/AAAAAAAAADE/Cg28l-uQV0A/s320/region2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5532379010277729890" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-1000317142079457921?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/1000317142079457921/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/code-mit-region-gliedern.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1000317142079457921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1000317142079457921'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/code-mit-region-gliedern.html' title='Code mit #region gliedern'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_P4vFjTE5R5s/TMb1LsGYKrI/AAAAAAAAAC8/kwFC9CYAEQw/s72-c/region1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5245982568671369176</id><published>2010-10-20T00:38:00.000+02:00</published><updated>2010-10-20T00:38:00.522+02:00</updated><title type='text'>Komprimierung mit C#, Teil 3 - Archive erstellen und wieder entpacken</title><content type='html'>Im 3. und (vorerst) letzten Teil zur Reihe "Komprimierung in C#" möchte ich euch eine Möglichkeit zeigen, mehrere Dateien auf einmal in einem Archiv zu komprimieren und dieses wieder zu entpacken.&lt;br /&gt;Um diesen Post hier zu verstehen, ist ein Verständnis der Techniken aus Teil 1 und 2 hilfreich.&lt;br /&gt;Mehrere Dateien in ein Archiv zu verpacken, geht in C# nur über einen kleinen Umweg, denn das verwendete &lt;span style="font-style:italic;"&gt;gzip&lt;/span&gt; - Format unterstützt standardmäßig nur die Komprimierung von einzelnen Dateien.&lt;br /&gt;Sammlungen von mehreren Dateien werden so meistens zuerst mit &lt;span style="font-style:italic;"&gt;tar&lt;/span&gt; und dann mit &lt;span style="font-style:italic;"&gt;gzip&lt;/span&gt; komprimiert, sie erhalten dann die Endung &lt;span style="font-style:italic;"&gt;.tar.gz&lt;/span&gt;.&lt;br /&gt;Obwohl uns das &lt;span style="font-style:italic;"&gt;tar&lt;/span&gt; - Format in .Net nicht zur Verfügung steht, lässt sich eine Komprimierung von mehreren Dateien doch umsetzen: Wir fassen die einzelnen Dateien einfach zu einer großen Datei zusammen, in welcher die Dateien durch besondere Zeichen voneinander getrennt sind. Diese große Datei wird dann komprimiert und beim Dekomprimieren wieder anhand der Sonderzeichen in die einzelnen Dateien aufgeteilt.&lt;br /&gt;&lt;br /&gt;Die Technik:&lt;br /&gt;Als Kennzeichnung zwischen den Dateien schrieb ich folgenden Header vor jede Datei in den Stream:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;|*START*OF*HEADER*|*||GRÖSSE_DER_DATEI||NAME_DER_DATEI*|*END*OF*HEADER*|&lt;/span&gt;&lt;br /&gt;Probleme könnte es also in dem unwahrscheinlichen Fall geben, wenn der Inhalt einer Datei der Struktur gleichen würde.&lt;br /&gt;&lt;br /&gt;Die Komprimierung / Erstellung eines Archivs:&lt;br /&gt;Der Methode zur Komprimierung werden die zu komprimierenden Dateien als&lt;span style="font-style:italic;"&gt; String - Array&lt;/span&gt; übergeben sowie der Name und Pfad des Archivs.&lt;br /&gt;Die Dateien werden nun durchlaufen und der jeweilige Header sowie anschließend der Inhalt der Datei wird zuerst in einen &lt;span style="font-style:italic;"&gt;MemoryStream&lt;/span&gt; geschrieben.&lt;br /&gt;Die Daten aus diesem werden anschließend in ein &lt;span style="font-style:italic;"&gt;byte - Array&lt;/span&gt; kopiert und dieses wird dann mit einem &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; in die Archivdatei geschrieben.&lt;br /&gt;Dadurch, dass die Dateien erst zusammengefasst und dann mit dem &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; geschrieben werden und nicht jede Datei nacheinander in das Archiv geschrieben wird, kann das Archiv viel stärker komprimiert werden, da auch Redundanzen zwischen den einzelnen Dateien ausgenutzt werden können.&lt;br /&gt;Der Code:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; CreateArchive(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] files, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; archiv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream CompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(archiv, FileMode.Create), CompressionMode.Compress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream NormalFileStream;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Content;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] HeaderStart = encoder.GetBytes(&lt;span style="color:#A31414;"&gt;"|*START*OF*HEADER*|*"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] HeaderEnd = encoder.GetBytes(&lt;span style="color:#A31414;"&gt;"*|*END*OF*HEADER*|"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] FileSize; &lt;span style="color:#008000;"&gt;// Größe der aktuellen Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Separator = encoder.GetBytes(&lt;span style="color:#A31414;"&gt;"||"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] FileName; &lt;span style="color:#008000;"&gt;// Name der aktuellen Datei&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream TempStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; file &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; files)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(file, FileMode.Open);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileSize = encoder.GetBytes(NormalFileStream.Length.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileName = encoder.GetBytes(file.Substring(file.LastIndexOf('\\') + 1));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(HeaderStart, 0, HeaderStart.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(Separator, 0, Separator.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(FileSize, 0, FileSize.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(Separator, 0, Separator.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(FileName, 0, FileName.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(HeaderEnd, 0, HeaderEnd.Length);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Content = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[NormalFileStream.Length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Read(Content, 0, Content.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Write(Content, 0, Content.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BigFileContent = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[TempStream.Length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Position = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Read(BigFileContent, 0, BigFileContent.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Write(BigFileContent, 0, BigFileContent.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Die Dekomprimierung / Entpackung eines Archivs:&lt;br /&gt;Die Komprimierung war der einfache Part, die Dekomprimierung gestaltet sich etwas schwieriger.&lt;br /&gt;Die Methode zur Dekomprimierung erhält den Pfad und Namen des Archivs sowie den Pfad, in den die Dateien anhand ihrer ursprünglichen Namen entpackt werden sollen.&lt;br /&gt;Zuerst müssen die Daten aus der Archivdatei dekomprimiert werden, hierzu wird diese mit einem &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; ausgelesen.&lt;br /&gt;Der Inhalt dieses wird anschließend in einen &lt;span style="font-style:italic;"&gt;MemoryStream&lt;/span&gt; kopiert und dieser schreibt seinen Inhalt in ein &lt;span style="font-style:italic;"&gt;byte - Array&lt;/span&gt; (ist leichter über einen &lt;span style="font-style:italic;"&gt;MemoryStream&lt;/span&gt;, deswegen der Umweg).&lt;br /&gt;Das &lt;span style="font-style:italic;"&gt;byte - Array&lt;/span&gt; wird mit einer Instanz der Klasse &lt;span style="font-style:italic;"&gt;ASCIIEncoder&lt;/span&gt; in einen &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; umgewandelt.&lt;br /&gt;Das Auswerten des Inhalts erfolgt in einer Endlosschleife, in jedem Durchlauf wird eine Datei behandelt.&lt;br /&gt;Es gibt 2 Zeiger, die auf eine Position im String zeigen.&lt;br /&gt;Der erste speichert die aktuelle Position, der zweite die aktuelle Suchposition.&lt;br /&gt;Der erste steht immer auf der Position, an der der Header der aktuellen Datei anfängt, der zweite auf eine um 22 höhere Position (da wo die Dateigröße anfängt).&lt;br /&gt;Da die Struktur des Headers bekannt ist (z.B. die Größe der ersten Datei beginnt ab Position 22 und geht bis zum ersten Vorkommen von "||" - deshalb steht die Suchposition auf einer um 22 höheren Position als die aktuelle Position, nach der Suchposition markiert das erste Vorkommen von "||" das Ende der Dateigröße, davor taucht noch ein "||" vor der Dateigröße aus.), können Dateigröße und Name ausgelesen werden.&lt;br /&gt;Die aktuelle Position wird nun um die Länge des Headers inkrementiert.&lt;br /&gt;Mit einem &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; wird nun das byte -  Array, welches den Inhalt der großen Datei speichert, von der aktuellen Position bis zur Position &lt;span style="font-style:italic;"&gt;aktuelle Position zuzüglich aktueller Dateilänge&lt;/span&gt;, in eine neue Datei geschrieben, diese wird im übergebenen Verzeichnis angelegt und trägt den Namen der ursprünglichen Datei.&lt;br /&gt;Die Positionszeiger werden anschließend um die Größe der aktuellen Datei erhöht.&lt;br /&gt;Der Code:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; OpenArchive(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; archiv, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; decompressPath)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream DecompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(archiv, FileMode.Open), CompressionMode.Decompress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream NormalFileStream;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream TempStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding decoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding Encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; StringFromBytes; &lt;span style="color:#008000;"&gt;// String - Darstellung der eingelesenen Bytes&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; EndSize; &lt;span style="color:#008000;"&gt;// Position im Header, an welcher die Bezeichnung der Dateigröße zu Ende ist&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;long&lt;/span&gt; FileLength; &lt;span style="color:#008000;"&gt;// Größe der aktuellen Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; StartFileName; &lt;span style="color:#008000;"&gt;// Position im Header, an welcher die Bezeichnung des Dateinamens anfängt&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; EndFileName; &lt;span style="color:#008000;"&gt;// Position im Header, an welcher die Bezeichnung des Dateinamens aufhört&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; FileName; &lt;span style="color:#008000;"&gt;// Name der aktuellen Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; EmptyHeader = &lt;span style="color:#A31414;"&gt;"|*START*OF*HEADER*|*||||*|*END*OF*HEADER*|"&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// "Prototyp" des Headers&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] EmptyHeaderBytes = Encoder.GetBytes(EmptyHeader); &lt;span style="color:#008000;"&gt;// Prototyp als Bytes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;long&lt;/span&gt; CurrentPosition = 0; &lt;span style="color:#008000;"&gt;// aktuelle Position im Inhalt der Datei&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;long&lt;/span&gt; CurrentSearchPosition = 22; &lt;span style="color:#008000;"&gt;// aktuelle Suchposition im Inhalt der Datei&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DecompressStream.CopyTo(TempStream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] BigFileContent = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[TempStream.Length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Position = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempStream.Read(BigFileContent, 0, BigFileContent.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringFromBytes = decoder.GetString(BigFileContent);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndSize = StringFromBytes.IndexOf(&lt;span style="color:#A31414;"&gt;"||"&lt;/span&gt;, (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)CurrentSearchPosition);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileLength = &lt;span style="color:#0000FF;"&gt;long&lt;/span&gt;.Parse(StringFromBytes.Substring((&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)CurrentSearchPosition, EndSize - (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)CurrentSearchPosition)); &lt;span style="color:#008000;"&gt;// die Bezeichnung der Dateigröße geht von Position 22 im Header bis Position EndSize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StartFileName = EndSize + 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndFileName = StringFromBytes.IndexOf(&lt;span style="color:#A31414;"&gt;"*|*"&lt;/span&gt;, StartFileName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileName = StringFromBytes.Substring(StartFileName, EndFileName - StartFileName); &lt;span style="color:#008000;"&gt;// Dateinamen auslesen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CurrentPosition += EmptyHeaderBytes.Length + Encoder.GetBytes(FileLength.ToString()).Length + Encoder.GetBytes(FileName).Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(decompressPath + &lt;span style="color:#A31414;"&gt;"\\"&lt;/span&gt; + FileName, FileMode.Create);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Write(BigFileContent, (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)CurrentPosition, (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;)FileLength);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CurrentPosition += FileLength;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CurrentSearchPosition = CurrentPosition + 22;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Close();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (CurrentSearchPosition &amp;gt; BigFileContent.Length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DecompressStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5245982568671369176?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5245982568671369176/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-3-archive.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5245982568671369176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5245982568671369176'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-3-archive.html' title='Komprimierung mit C#, Teil 3 - Archive erstellen und wieder entpacken'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-290854565135633692</id><published>2010-10-18T00:42:00.000+02:00</published><updated>2010-10-18T00:42:00.244+02:00</updated><title type='text'>Komprimierung mit C#, Teil 2 - Dateien komprimieren</title><content type='html'>Heute setzte ich das Tutorial zu Komprimierungsmethoden in C# aus dem vorigen Post fort.&lt;br /&gt;Während es im selbigen um das Grundprinzip und die Komprimierung / Dekomprimierung von einfachen Zeichenketten ging, zeige ich jetzt eine etwas fortgeschrittenere Anwendung dieser Prinzipien zum Komprimieren / Dekomprimieren von ganzen Dateien.&lt;br /&gt;&lt;br /&gt;Die Kompression:&lt;br /&gt;Wie bei der Komprimierung von Zeichenketten legen wir eine neue Instanz der Klasse &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; an und übergeben dieser im Konstruktor einen &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt;, der auf die Zieldatei zeigt.&lt;br /&gt;Wir legen weiterhin einen anderen &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; an, der auf die Quelldatei zeigt.&lt;br /&gt;Mit diesem lesen wir nun den Inhalt der alten Datei in ein &lt;span style="font-style:italic;"&gt;byte&lt;/span&gt;&lt;span style="font-style:italic;"&gt; - Array&lt;/span&gt;.&lt;br /&gt;Schreiben wir dieses nun mit der Methode &lt;span style="font-style:italic;"&gt;Write()&lt;/span&gt; des &lt;span style="font-style:italic;"&gt;GZipStreams&lt;/span&gt;, schreibt dieser den komprimierten Inhalt der Quelldatei in die Zieldatei - wir haben eine Datei komprimiert, fast so, als hätten wir sie per WinZip oder einem ähnlichen Programm zu einem Archiv hinzugefügt.&lt;br /&gt;Öffnet man die komprimierte Datei mit einem Entpackungsprorgamm (z.B. WinZip), kann man das ursprüngliche Bild extrahieren und öffnen.&lt;br /&gt;Der entsprechende Code dazu:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; CompressFile(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; normalFile, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; compressedFile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream CompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(compressedFile, FileMode.Create), CompressionMode.Compress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream NormalFileStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(normalFile, FileMode.Open);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Content = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[NormalFileStream.Length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Read(Content, 0, Content.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Close();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Write(Content, 0, Content.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;br /&gt;Nun die Dekompression:&lt;br /&gt;Hierfür wird im Konstruktor des &lt;span style="font-style:italic;"&gt;GZipStreams&lt;/span&gt; ein &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt;, der auf die auszulesende, komprimierte Datei zeigt, übergeben.&lt;br /&gt;Außerdem wird ein neuer &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; angelegt, welcher auf die zu schreibende, dekomprimierte Datei zeigt.&lt;br /&gt;Wie im vorigen Post auch zur Dekomprimierung benutzt, wird nun eine Endlosschleife eingesetzt, um die komprimierte Datei auszulesen.&lt;br /&gt;Hierfür wird die Methode &lt;span style="font-style:italic;"&gt;Read()&lt;/span&gt; des &lt;span style="font-style:italic;"&gt;GZipStreams&lt;/span&gt; verwendet, welche die übergebene Anzahl an Bytes einliest und dabei dekomprimiert. Das Ergebnis wird in einem Buffer gespeichert, welcher dann über den &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; in die neue Datei geschrieben wird.&lt;br /&gt;Wurde das Ende der Datei erreicht, liest die Methode &lt;span style="font-style:italic;"&gt;Read()&lt;/span&gt; weniger Bytes als in den Buffer passen würden, woran das Programm das Ende erkennt.&lt;br /&gt;Die komprimierte Datei wurde nun entpackt und wieder als lesbare Datei angelegt.&lt;br /&gt;Der Code dazu lautet:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; DecompressFile(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; compressedFile, &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; normalFile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream DecompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(compressedFile, FileMode.Open), CompressionMode.Decompress);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream NormalFileStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(normalFile, FileMode.Create);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BytesReadCount = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Buffer = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4096];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BytesReadCount = DecompressStream.Read(Buffer, 0, Buffer.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BytesReadCount != 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Write(Buffer, 0, BytesReadCount);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BytesReadCount &amp;lt; Buffer.Length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NormalFileStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DecompressStream.Close();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-290854565135633692?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/290854565135633692/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-2-dateien.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/290854565135633692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/290854565135633692'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-2-dateien.html' title='Komprimierung mit C#, Teil 2 - Dateien komprimieren'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-9159217622867304419</id><published>2010-10-17T16:22:00.001+02:00</published><updated>2010-10-30T16:03:37.717+02:00</updated><title type='text'>Webcam Chat</title><content type='html'>Auf Anfrage eines Lesers habe ich mich kürzlich der Realisierung eines etwas aufwendigeren Projekts gewidmet, der Entwicklung eines in C# implementierten Webcam Chats.&lt;br /&gt;Diesen möchte ich in diesem Post vorstellen, zum Verständnis sind einige Vorkenntnisse hilfreich:&lt;br /&gt;- Den Code zur Einbindung einer Webcam habe ich mit Erlaubnis vom &lt;a href="http://www.net-blog.net/blog/index.php/2010/06/23/c-webcams-benutzen/"&gt;net-blog&lt;/a&gt; übernommen.&lt;br /&gt;- Die Verbindung der Partner wird über &lt;span style="font-style:italic;"&gt;TCP / IP&lt;/span&gt; hergestellt, hierzu gibt es eine Einführung auf diesem Blog (&lt;a href="http://csharp-tricks.blogspot.com/2010/09/datenaustausch-im-internet-und-netzwerk.html"&gt;hier&lt;/a&gt;).&lt;br /&gt;- Viele möchten sich sicherlich über das Internet mit Freunden vernetzen, wie die Verbindung darüber läuft und insbesondere welche IPs zu verwenden sind, findet ihr &lt;a href="http://csharp-tricks.blogspot.com/2010/09/datenaustausch-im-internet-und-netzwerk.html"&gt;hier&lt;/a&gt; (und auch noch allgemeine Infos zur Vernetzung im LAN).&lt;br /&gt;- Wie in Bild "gestreamt" werden kann wird in &lt;a href="http://csharp-tricks.blogspot.com/2010/10/bild-in-byte-array-speichern.html"&gt;diesem Post&lt;/a&gt; erklärt.&lt;br /&gt;- Und schließlich gibt's &lt;a href="http://csharp-tricks.blogspot.com/2010/10/allgemeiner-fehler-in-gdi.html"&gt;hier&lt;/a&gt; allgemeine Infos zum Fehler "Allgemeiner Fehler in GDI+", welcher sporadisch bei Grafikanwendungen auftritt.&lt;br /&gt;&lt;br /&gt;Hier die Oberfläche des Programms:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_P4vFjTE5R5s/TLsD1sboHwI/AAAAAAAAACs/GLS-YU1T6pw/s1600/webcam.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 169px;" src="http://4.bp.blogspot.com/_P4vFjTE5R5s/TLsD1sboHwI/AAAAAAAAACs/GLS-YU1T6pw/s320/webcam.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529017188522401538" /&gt;&lt;/a&gt;&lt;br /&gt;In der linken &lt;span style="font-style:italic;"&gt;PictureBox&lt;/span&gt; wird das Bild der eigenen Kamera angezeigt, in der rechten das des Chat Partners.&lt;br /&gt;Der Chat Partner muss natürlich auch das gleiche Programm laufen haben.&lt;br /&gt;&lt;br /&gt;Zur Funktionsweise:&lt;br /&gt;Beim Klick auf den Button "Verbinden" werden 2 &lt;span style="font-style:italic;"&gt;Threads&lt;/span&gt; gestartet, einer davon dient zum Senden des eigenen Bildes und der andere zum Empfangen des Bildes des anderen.&lt;br /&gt;Der Senden - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; läuft auf dem unter "eigener Port" angegebenen Port, der Empfangs - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; über den unter "Partner Port".&lt;br /&gt;Zum Verbinden müssen also logischerweise beide Partner die IP - Adresse des jeweiligen Partners eingeben sowie passende Ports, also Partner A den Port x unter "eigener Port" und Port y unter "Partner Port", Partner B muss diese Daten andersherum eingeben.&lt;br /&gt;Im Senden - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; wird ein Server erstellt, auf welchen sich der Client aus dem Empfangs - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; des Clients verbindet.&lt;br /&gt;In jeder Instanz des Programms gibt es also 2 Server - Client Verbindungen, die jeweils über einen Netzwerkstream kommunizieren.&lt;br /&gt;In dem Senden - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; wird in einer Endlosschleife versucht, das Bild der eigenen &lt;span style="font-style:italic;"&gt;PictureBox&lt;/span&gt; über die Methode &lt;span style="font-style:italic;"&gt;WriteImage()&lt;/span&gt; zu senden.&lt;br /&gt;In dieser wird zuerst das Bild über einen temporären Stream in ein byte - Array  geschrieben. Dann wird die Größe dieses Arrays in einen 20-stelligen String geschrieben, wobei die restlichen Stellen mit dem Buchstaben "x" aufgefüllt werden.&lt;br /&gt;Die Größe und der eigentliche Inhalt des Bildes werden dann über den Netzwerkstream gesendet.&lt;br /&gt;In dem Empfangs - &lt;span style="font-style:italic;"&gt;Thread&lt;/span&gt; wird in einer Endlosschleife versucht, diesen Stream über die Methode &lt;span style="font-style:italic;"&gt;ReadImage()&lt;/span&gt; auszulesen.&lt;br /&gt;Als erstes werden hier in jedem Zyklus die ersten 20 Bytes ausgelesen, welches die Größe des Bildes sein sollten.&lt;br /&gt;Kann der erhaltene String in eine sinnvolle Zahl g konvertiert werden, werden die nächsten g Bytes aus dem Netzwerkstream gelesen und daraus das Bild reproduziert.&lt;br /&gt;Können die 20 Bytes nicht konvertiert werden, gab es einen Übertragungsfehler. Damit Server und Client sich wieder synchronisieren, muss der Stream gelöscht werden. Hierzu werden einfach so lange Bytes aus dem Stream herausgelesen, bis dieser leer ist.&lt;br /&gt;Allgemein stellte sich die Realisierung der Datenübertragung als ziemlich schwer heraus, Server und Client wurden immer wieder asynchron und es traten viele Übertragungsfehler aus.&lt;br /&gt;In der hier veröffentlichten Version werden bei Erfolg beim Senden und Empfangen eines Bildes die jeweiligen Bilder in einer Variablen gespeichert. Tritt an einer Stelle ein Fehler auf, wird das gespeicherte Bild wiederverwendet.&lt;br /&gt;So, das sollte als Ablaufbeschreibung reichen, wie gesagt, die einzelnen Programmteile sollten bei Verständnis der oben erwähnten Themen leicht verständlich sein.&lt;br /&gt;Ich weiß, diese Version hier ist nur ein erster Anfang, sie soll lediglich zu Demozwecken zeigen, wie ein solcher Webcam - Chat realisiert werden kann und kann beliebig erweitert werden.&lt;br /&gt;Für Hinweise und Verbesserungsvorschläge bin ich aber immer dankbar.&lt;br /&gt;Viel Spaß mit dem Programm!&lt;br /&gt;&lt;br /&gt;Ein Setup, mit der sich der Webcam Chat installieren lässt, ist über &lt;a href="http://www.mediafire.com/?it7euwkw6ue5t4f"&gt;diesen Link&lt;/a&gt; erreichbar.&lt;br /&gt;Das komplette Projekt inklusive Quelldateien gibt es &lt;a href="http://www.mediafire.com/?6c2n440nle6qdld"&gt;hier&lt;/a&gt;.&lt;br /&gt;Und nun der Quellcode, zuerst der Inhalt der Datei &lt;span style="font-style:italic;"&gt;Form1.cs&lt;/span&gt; und dann auch der Inhalt der Datei &lt;span style="font-style:italic;"&gt;Form1.Designer.cs&lt;/span&gt;, kopiert ihr auch letztere in euer Projekt, habt ihr genau die gleiche Oberfläche wie ich.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Form1.cs:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;// für Webcam&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AForge.Video;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AForge.Video.DirectShow;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;// für Netzwerk&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.IO;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net.Sockets;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Threading;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt; : Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Webcam&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Unser Webcam Objekt&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VideoCaptureDevice videoSource;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; InitWebCam(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; nr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Auflistung aller Webcam/Videogeräte&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FilterInfoCollection videosources = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FilterInfoCollection(FilterCategory.VideoInputDevice);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Überprüfen, ob mindestens eine Webcam gefunden wurde&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (videosources != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Die Webcam "nr" an unser Webcam Objekt binden&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; VideoCaptureDevice(videosources[nr].MonikerString);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Überprüfen ob die Webcam Technische-Eigenschaften mitliefert&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (videoSource.VideoCapabilities.Length &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; lowestSolution = &lt;span style="color:#A31414;"&gt;"10000;0"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Das Profil mit der niedrigsten Auflösung suchen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; videoSource.VideoCapabilities.Length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (videoSource.VideoCapabilities[i].FrameSize.Width &amp;lt; Convert.ToInt32(lowestSolution.Split(';')[0]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lowestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + &lt;span style="color:#A31414;"&gt;";"&lt;/span&gt; + i.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Dem Webcam Objekt die niedrigstmögliche Auflösung übergeben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource.DesiredFrameSize = videoSource.VideoCapabilities[Convert.ToInt32(lowestSolution.Split(';')[1])].FrameSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(e.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Dem Webcam Objekt den NewFrame Eventhandler zuweisen.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Dieser schlägt bei jedem eingehenden Bild der Webcam an&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource.NewFrame += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; AForge.Video.NewFrameEventHandler(videoSource_NewFrame);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Die Webcam aktivieren&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource.Start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; videoSource_NewFrame(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, AForge.Video.NewFrameEventArgs eventArgs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Jedes ankommende Bild von der Webcam der Picturebox zuweisen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pictureBoxVideoSelf.BackgroundImage = (Image)eventArgs.Frame.Clone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image LastImageSent = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// zuletzt korrekt gesendetes Bild&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image LastImageReceived = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// zuletzt korrekt empfangenes Bild&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread Sender; &lt;span style="color:#008000;"&gt;// Thread zum Senden von Bildern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread Receiver; &lt;span style="color:#008000;"&gt;// Thread zum Empfangen von Bildern&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; Closing = &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// true wenn Formular beendet werden soll&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String ClosingString = &lt;span style="color:#A31414;"&gt;"FORM#CLOSING"&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// Nachricht, die bei Beendigung geschickt wird&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ClosingBytes; &lt;span style="color:#008000;"&gt;// Byte - Darstellung der Nachricht&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding ByteConverter = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding(); &lt;span style="color:#008000;"&gt;// Objekt zur Konvertierung von Strings in byte - Arrays und umgekehrt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Thread zum Senden des eigenen Bildes starten&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sender = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Thread(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ParameterizedThreadStart(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Send));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sender.Start(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.Parse(textBox4.Text));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Thread zum Empfangen des Partnerbildes starten&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Receiver = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Thread(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ParameterizedThreadStart(Receive));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Receiver.Start(textBox2.Text + &lt;span style="color:#A31414;"&gt;"-"&lt;/span&gt; + textBox1.Text);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClosingBytes = ByteConverter.GetBytes(ClosingString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Send(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; port)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitWebCam(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.Parse(textBox3.Text)); &lt;span style="color:#008000;"&gt;// Webcam starten&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TcpListener Server = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; TcpListener(&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.Parse(port.ToString()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Server.Start();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TcpClient Client = Server.AcceptTcpClient();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NetworkStream ClientStream = Client.GetStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Closing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// Beendigung&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// probieren, das aktuelle Bild an den Partner zu senden, dieses dann als Backupbild speichern&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteImage((Image)pictureBoxVideoSelf.BackgroundImage.Clone(), ClientStream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastImageSent = (Image)pictureBoxVideoSelf.BackgroundImage.Clone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// konnte das aktuelle Bild nicht gesendet werden, das Backupbild senden&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteImage(LastImageSent, ClientStream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientStream.Write(ClosingBytes, 0, ClosingBytes.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt; { };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Receive(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; portip)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// portip hat die Form "port-ip"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;[] Parameter = portip.ToString().Split('-');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Net.IPAddress IP = System.Net.IPAddress.Parse(Parameter[1]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TcpClient Exchange = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; TcpClient();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NetworkStream ExchangeStream = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image TempImage;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// alle 3 Sekunden versuchen eine Verbindung herzustellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exchange.Connect(IP, &lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.Parse(Parameter[0]));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExchangeStream = Exchange.GetStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(3000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Closing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// Beendigung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// versuchen, das empfangene Bild zu lesen darzustellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// bei Erfolg&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempImage = ReadImage(ExchangeStream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (TempImage == &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; Exception();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pictureBoxVideoPartner.BackgroundImage = TempImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastImageReceived = (Image)pictureBoxVideoPartner.BackgroundImage.Clone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// bei Fehler das Backupbild darstellen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pictureBoxVideoPartner.BackgroundImage = LastImageReceived;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt; { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; WriteImage(Image image, NetworkStream stream)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding Encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream TempStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Buffer;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das übergebene Bild in den aktuellen Stream schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image.Save(TempStream, System.Drawing.Imaging.ImageFormat.Gif);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Buffer = TempStream.ToArray();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Größe des Bildes als 20-stelligen String darstellen, mit "x" auffüllen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ImageSize = Buffer.Length.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (ImageSize.Length &amp;lt; 20)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageSize += &lt;span style="color:#A31414;"&gt;"x"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die Größe plus die Daten des Bildes in ein Array schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] FittedImageSize = Encoder.GetBytes(ImageSize);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ImagePlusSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[FittedImageSize.Length + Buffer.Length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array.Copy(FittedImageSize, ImagePlusSize, FittedImageSize.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array.Copy(Buffer, 0, ImagePlusSize, FittedImageSize.Length, Buffer.Length);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// das zusammengefasste Array schreiben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream.Write(ImagePlusSize, 0, ImagePlusSize.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream.Flush();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// kann der Stream nicht mehr beschrieben werden, hat der Partner beendet&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Closing = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; Image ReadImage(NetworkStream stream)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BytesRead;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// die ersten 20 Bytes des Streams einlesen, denn in diesen ist die Größe kodiert&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ImageSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[20];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BytesRead = stream.Read(ImageSize, 0, 20);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* konnten nur 12 Bytes gelesen werden und haben diese den Inhalt des&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Closing Strings, so soll beendet werden */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BytesRead == 12)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (ByteConverter.GetString(ImageSize, 0, 12) == &lt;span style="color:#A31414;"&gt;"FORM#CLOSING"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Closing = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ErrorBuffer = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[100000000];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding Decoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ImageSizeString = Decoder.GetString(ImageSize).Replace(&lt;span style="color:#A31414;"&gt;"x"&lt;/span&gt;, &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; TestSize;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.TryParse(ImageSizeString, &lt;span style="color:#0000FF;"&gt;out&lt;/span&gt; TestSize))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream.Read(ErrorBuffer, 0, ErrorBuffer.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] ImageFile = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;.Parse(ImageSizeString)];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream.Read(ImageFile, 0, ImageFile.Length);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream temps = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temps.Write(ImageFile, 0, ImageFile.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result = Image.FromStream(temps);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; Result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Form1_FormClosing(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, FormClosingEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;//Webcam beim Schließen des Programms wieder freigeben&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (videoSource != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; videoSource.IsRunning)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource.SignalToStop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;videoSource = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Closing = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(3000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Sender != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Sender.IsAlive)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sender.Abort();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (Receiver != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Receiver.IsAlive)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Receiver.Abort();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Form1.Designer.cs:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF;"&gt;Form1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Erforderliche Designervariable.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.ComponentModel.IContainer components = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Verwendete Ressourcen bereinigen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="disposing"&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;override&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (disposing &amp;amp;&amp;amp; (components != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;components.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region Vom Windows Form-Designer generierter Code&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Erforderliche Methode für die Designerunterstützung.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; InitializeComponent()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.PictureBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Button();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.PictureBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Label();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Label();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Label();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Label();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5 = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.Label();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf)).BeginInit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner)).BeginInit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.SuspendLayout();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// pictureBoxVideoSelf&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(47, 26);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.Name = &lt;span style="color:#A31414;"&gt;"pictureBoxVideoSelf"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(331, 210);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.TabIndex = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf.TabStop = &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// button1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Font = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Font(&lt;span style="color:#A31414;"&gt;"Microsoft Sans Serif"&lt;/span&gt;, 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;)(0)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(326, 263);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Name = &lt;span style="color:#A31414;"&gt;"button1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(154, 46);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.TabIndex = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Text = &lt;span style="color:#A31414;"&gt;"Verbinden"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.UseVisualStyleBackColor = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1.Click += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.EventHandler(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1_Click);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// pictureBoxVideoPartner&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(398, 26);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.Name = &lt;span style="color:#A31414;"&gt;"pictureBoxVideoPartner"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(319, 210);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.TabIndex = 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner.TabStop = &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// label1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1.AutoSize = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(25, 281);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1.Name = &lt;span style="color:#A31414;"&gt;"label1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(0, 13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1.TabIndex = 4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// label2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.AutoSize = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(47, 249);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.Name = &lt;span style="color:#A31414;"&gt;"label2"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(54, 13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.TabIndex = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2.Text = &lt;span style="color:#A31414;"&gt;"Partner IP"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// label3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.AutoSize = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(47, 273);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.Name = &lt;span style="color:#A31414;"&gt;"label3"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(63, 13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.TabIndex = 6;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3.Text = &lt;span style="color:#A31414;"&gt;"Partner Port"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// label4&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.AutoSize = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(47, 321);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.Name = &lt;span style="color:#A31414;"&gt;"label4"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(73, 13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.TabIndex = 7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4.Text = &lt;span style="color:#A31414;"&gt;"Webcam - Nr."&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(128, 249);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Name = &lt;span style="color:#A31414;"&gt;"textBox1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(158, 20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1.TabIndex = 8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(128, 273);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Name = &lt;span style="color:#A31414;"&gt;"textBox2"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(158, 20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2.TabIndex = 9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(128, 321);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3.Name = &lt;span style="color:#A31414;"&gt;"textBox3"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(158, 20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3.TabIndex = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3.Text = &lt;span style="color:#A31414;"&gt;"0"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// textBox4&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(128, 297);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4.Name = &lt;span style="color:#A31414;"&gt;"textBox4"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(158, 20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4.TabIndex = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// label5&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.AutoSize = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.Location = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Point(47, 297);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.Name = &lt;span style="color:#A31414;"&gt;"label5"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.Size = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(64, 13);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.TabIndex = 11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5.Text = &lt;span style="color:#A31414;"&gt;"eigener Port"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// Form1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AutoScaleDimensions = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.SizeF(6F, 13F);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ClientSize = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Drawing.Size(758, 370);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.textBox1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.label1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.button1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Name = &lt;span style="color:#A31414;"&gt;"Form1"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Text = &lt;span style="color:#A31414;"&gt;"C# Webcam Chat"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.FormClosing += &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; System.Windows.Forms.FormClosingEventHandler(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.Form1_FormClosing);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoSelf)).EndInit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.pictureBoxVideoPartner)).EndInit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.ResumeLayout(&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;.PerformLayout();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.PictureBox pictureBoxVideoSelf;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Button button1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.PictureBox pictureBoxVideoPartner;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Label label1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Label label2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Label label3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Label label4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; System.Windows.Forms.Label label5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-9159217622867304419?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/9159217622867304419/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/webcam-chat.html#comment-form' title='10 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/9159217622867304419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/9159217622867304419'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/webcam-chat.html' title='Webcam Chat'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_P4vFjTE5R5s/TLsD1sboHwI/AAAAAAAAACs/GLS-YU1T6pw/s72-c/webcam.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-8632402616102517753</id><published>2010-10-15T19:52:00.004+02:00</published><updated>2010-10-15T19:52:00.394+02:00</updated><title type='text'>Komprimierung mit C#, Teil 1 - einfache Strings</title><content type='html'>Das .Net Studio bringt standardmäßig eine Klasse zur Komprimierung und Dekomprimierung von Daten im &lt;span style="font-style:italic;"&gt;gzip&lt;/span&gt; Format mit sich, &lt;span style="font-style:italic;"&gt;System.IO.Compression.GZipStream&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;gzip&lt;/span&gt; ist ein gutes, offen verfügbares Format, welches, für technisch Interessierte, zur Komprimierung, ähnlich wie das &lt;span style="font-style:italic;"&gt;ZIP&lt;/span&gt; - Format, den &lt;a href="http://de.wikipedia.org/wiki/Deflate"&gt;Deflate&lt;/a&gt; Algorithmus verwendet.&lt;br /&gt;Die Klasse &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; ist ein &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt;, wie herkömmliche &lt;span style="font-style:italic;"&gt;Streams&lt;/span&gt; können mit ihr Daten geschrieben und gelesen werden, nur werden diese dabei direkt komprimiert bzw. dekomprimiert.&lt;br /&gt;Als erstes Anwendungsbeispiel werde ich eine einfache Möglichkeit zur (De-)Komprimierung von Zeichenketten in (bzw. aus) einer Datei zeigen.&lt;br /&gt;Für alle folgenden Codebeispiele werden die Anweisungen&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.IO.Compression;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.IO;&lt;/blockquote&gt;&lt;br /&gt;benötigt.&lt;br /&gt;&lt;br /&gt;Zuerst zur Komprimierung: Die Klasse &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; erwartet einen &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt; im Konstruktor, in den die Daten hinein komprimiert werden sollen sowie den Komprimiermodus (hier &lt;span style="font-style:italic;"&gt;CompressionMode.Compress&lt;/span&gt;).&lt;br /&gt;Als &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt; geben wir einen &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; an, der auf die Datei zeigt, in welche der komprimierte &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; geschrieben werden soll.&lt;br /&gt;Die Klasse &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; kann nur Bytes lesen und schreiben, daher muss der zu komprimierende String in ein &lt;span style="font-style:italic;"&gt;byte&lt;/span&gt;&lt;span style="font-style:italic;"&gt; - Arra&lt;/span&gt;y umgewandelt werden, was die Klasse &lt;span style="font-style:italic;"&gt;ASCIIEncoding&lt;/span&gt; erledigt.&lt;br /&gt;Das erhaltene &lt;span style="font-style:italic;"&gt;Array&lt;/span&gt; wird dann mittels &lt;span style="font-style:italic;"&gt;Write()&lt;/span&gt; geschrieben, der &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; komprimiert die Byte - Folge und schreibt sie über den &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt; in eine Datei.&lt;br /&gt;Und so sieht der dazu passende Code aus:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; CompressString(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; uncompressedString)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream CompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(Application.StartupPath + &lt;span style="color:#A31414;"&gt;"\\CompressedString.gz"&lt;/span&gt;, FileMode.Create), CompressionMode.Compress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding Encoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] UncompressedStringInBytes = Encoder.GetBytes(uncompressedString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Write(UncompressedStringInBytes, 0, UncompressedStringInBytes.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompressStream.Close();&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Der der Methode &lt;span style="font-style:italic;"&gt;CompressString&lt;/span&gt; übergebene String wird in die Datei "CompressedString.gz" im Anwendungsverzeichnis geschrieben, .gz ist die Dateiendung für &lt;span style="font-style:italic;"&gt;gzip&lt;/span&gt; - Dateien.&lt;br /&gt;Die Datei kann mit herkömmlichen Entpackungsprogrammen (z.B. WinZip) entpackt werden, öffnet man die entpackte Datei mit einem Texteditor findet man den ursprünglichen &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; wieder.&lt;br /&gt;&lt;br /&gt;Nun zum umgekehrten Fall, der Dekomprimierung des Strings aus der Datei:&lt;br /&gt;Die Klasse &lt;span style="font-style:italic;"&gt;GZipStream&lt;/span&gt; erwartet im Konstruktor wieder einen &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt;, dieses Mal den &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt;, aus welchem die komprimierten Daten gelesen werden sollen, und den Komprimiermodus (hier &lt;span style="font-style:italic;"&gt;CompressionMode.Decompress&lt;/span&gt;).&lt;br /&gt;Wir übergeben als &lt;span style="font-style:italic;"&gt;Stream&lt;/span&gt; wieder einen &lt;span style="font-style:italic;"&gt;FileStream&lt;/span&gt;.&lt;br /&gt;Das Auslesen der Datei erfolgt nun durch eine Endlosschleife, in dieser wird jedes Mal über die Methode &lt;span style="font-style:italic;"&gt;Read()&lt;/span&gt; des &lt;span style="font-style:italic;"&gt;GZipStreams&lt;/span&gt; ein &lt;span style="font-style:italic;"&gt;byte - Array&lt;/span&gt; in einen Buffer gelesen.&lt;br /&gt;Die gelesenen Bytes werden über die Klasse &lt;span style="font-style:italic;"&gt;ASCIIEncoding&lt;/span&gt; in einen String umgewandelt, wurden in einem Durchlauf weniger Bytes gelesen als der Buffer groß ist, ist die Datei offensichtlich zu Ende und die Schleife wird beendet.&lt;br /&gt;Der Code:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; DecompressString(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; compressedFile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZipStream DecompressStream = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; GZipStream(&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FileStream(Application.StartupPath + &lt;span style="color:#A31414;"&gt;"\\CompressedString.gz"&lt;/span&gt;, FileMode.Open), CompressionMode.Decompress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[] Buffer = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;[4096];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ASCIIEncoding Decoder = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ASCIIEncoding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt; BytesReadCount = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; DecompressedString = &lt;span style="color:#A31414;"&gt;""&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BytesReadCount = DecompressStream.Read(Buffer, 0, Buffer.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BytesReadCount != 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DecompressedString += Decoder.GetString(Buffer, 0, BytesReadCount);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (BytesReadCount &amp;lt; Buffer.Length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DecompressStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; (DecompressedString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;br /&gt;Der Aufruf der beiden Methoden könnte zum Beispiel so aussehen:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;CompressString(&lt;span style="color:#A31414;"&gt;"Dies ist ein Test 123456."&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; DecompressedString = DecompressString(Application.StartupPath + &lt;span style="color:#A31414;"&gt;"\\CompressedString.gz"&lt;/span&gt;);&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-8632402616102517753?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/8632402616102517753/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-1-einfache.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8632402616102517753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/8632402616102517753'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/komprimierung-mit-c-teil-1-einfache.html' title='Komprimierung mit C#, Teil 1 - einfache Strings'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-5655285507594463980</id><published>2010-10-13T17:34:00.000+02:00</published><updated>2010-10-13T17:34:00.132+02:00</updated><title type='text'>Startseite des Internet Explorers auslesen / ändern</title><content type='html'>Die Startseite des Internet Explorers wird in der Registry gespeichert, und zwar im Schlüssel &lt;span style="font-style:italic;"&gt;HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page&lt;/span&gt;.&lt;br /&gt;Diese Information kann nun einfach mit C# ausgelesen und beliebig verändert werden.&lt;br /&gt;Ein kleines Tutorial zur Benutzung der Registry mit C# gab es &lt;a href="http://csharp-tricks.blogspot.com/2010/08/registry-tutorial.html"&gt;hier&lt;/a&gt;.&lt;br /&gt;Da so die benutzten Methoden bekannt sein sollten, poste ich hier nur kurz den Programmcode.&lt;br /&gt;Zuerst eine Methode, die die Startseite des Internet Explorers ausliest und als &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; zurückgibt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; GetIEStartPage()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegistryKey StartPageKey = Registry.CurrentUser.OpenSubKey(&lt;span style="color:#A31414;"&gt;@"Software\Microsoft\Internet Explorer\Main"&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// entsprechenden Pfad in der Registry öffnen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt; StartPageKey.GetValue(&lt;span style="color:#A31414;"&gt;"Start Page"&lt;/span&gt;).ToString(); &lt;span style="color:#008000;"&gt;// den Wert aus dem Schlüssel "Start Page" auslesen und zurückgeben&lt;/span&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Nun noch die Methode zum Ändern der Startseite, diese erwartet die neue Startseite als String - Parameter:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; SetIEStartPage(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; newStartPage)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegistryKey StartPageKey = Registry.CurrentUser.OpenSubKey(&lt;span style="color:#A31414;"&gt;@"Software\Microsoft\Internet Explorer\Main"&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// entsprechenden Pfad in der Registry mit Schreibrechten öffnen&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StartPageKey.SetValue(&lt;span style="color:#A31414;"&gt;"Start Page"&lt;/span&gt;, newStartPage); &lt;span style="color:#008000;"&gt;// den neuen Wert in den Schlüssel "Start Page" schreiben&lt;/span&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-5655285507594463980?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/5655285507594463980/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/startseite-des-internet-explorers.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5655285507594463980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/5655285507594463980'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/startseite-des-internet-explorers.html' title='Startseite des Internet Explorers auslesen / ändern'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-1919017543204204707</id><published>2010-10-11T08:00:00.000+02:00</published><updated>2010-10-11T08:00:00.581+02:00</updated><title type='text'>Computername herausfinden</title><content type='html'>Um mit C# den Namen des eigenen Computers herauszufinden, gibt es 2 einfache Möglichkeiten:&lt;br /&gt;Über die Klasse &lt;span style="font-style:italic;"&gt;Dns&lt;/span&gt; (&lt;span style="font-style:italic;"&gt;using System.Net&lt;/span&gt; wird benötigt):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ComputerName = Dns.GetHostName();&lt;/blockquote&gt;&lt;br /&gt;Und über die Klasse &lt;span style="font-style:italic;"&gt;SystenInformation&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; ComputerName = System.Windows.Forms.SystemInformation.ComputerName.ToString();&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-1919017543204204707?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/1919017543204204707/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/computername-herausfinden.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1919017543204204707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/1919017543204204707'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/computername-herausfinden.html' title='Computername herausfinden'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3709808271825745441.post-4314582069488107225</id><published>2010-10-08T08:00:00.005+02:00</published><updated>2011-06-27T21:20:37.844+02:00</updated><title type='text'>HTML - Seiten mit dem Webbrowser Steuerlement aufrufen</title><content type='html'>In C# gibt es ein fertiges Steuerelement, mit dem sich Internetseiten wie im Browser aufrufen lassen.&lt;br /&gt;Das Steuerelement heißt &lt;span style="font-style:italic;"&gt;WebBrowser&lt;/span&gt; und befindet sich standardmäßig schon in der Toolbox.&lt;br /&gt;Zieht man es auf ein Formular, erstreckt es sich wahrscheinlich standardmäßig über dessen ganze Breite, ist dieses nicht gewünscht, kann man die Eigenschaft &lt;span style="font-style:italic;"&gt;Dock&lt;/span&gt; ändern.&lt;br /&gt;So sieht ein Teil dieses Blogs im &lt;span style="font-style:italic;"&gt;WebBrowse&lt;/span&gt;r aus:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_P4vFjTE5R5s/TKoFv4yoDLI/AAAAAAAAACk/pQk4ROGUFvc/s1600/webbrowser.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 170px;" src="http://4.bp.blogspot.com/_P4vFjTE5R5s/TKoFv4yoDLI/AAAAAAAAACk/pQk4ROGUFvc/s320/webbrowser.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5524234213180050610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nun möchte ich ein paar Methoden dieses Steuerlements beschreiben:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Navigate()&lt;/span&gt;: Dieses ist wohl die wichtigste Methode, mit ihr kann man Seiten im &lt;span style="font-style:italic;"&gt;WebBrowser&lt;/span&gt; Steuerelement aufrufen. Sie erwartet in einer Überladung einen String als Parameter, welcher dann als Zieladresse interpretiert wird.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;GoHome()&lt;/span&gt;: Navigiert zur Startseite des aktuellen Benutzers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;GoSearch()&lt;/span&gt;: Navigiert zur Seite der Standardsuchmaschine des aktuellen Benutzers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Print()&lt;/span&gt;: Druckt die aktuelle Seite des Browsersteuerelements mit den aktuellen Druckeinstellungen des Systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ShowPrintDialog()&lt;/span&gt;: Ruft den "Drucken" Dialog des Internet Explorers auf, um die aktuelle Seite zu drucken.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ShowSaveAsDialog()&lt;/span&gt;: Öffnet den Dialog "Seite speichern", um die aktuelle Seite als HTML - Dokument zu speichern.&lt;br /&gt;&lt;br /&gt;Zum Schluss noch ein Link zu einer meiner Meinung nach sehr informativen Seite zum Thema Webbrowser, auf der auch ein kostenlos E-Book zu diesem Thema verfügbar ist:&lt;br /&gt;&lt;a href="http://www.readup.de/on/webbrowser"&gt;readup.de&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3709808271825745441-4314582069488107225?l=csharp-tricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csharp-tricks.blogspot.com/feeds/4314582069488107225/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/html-seiten-mit-dem-webbrowser.html#comment-form' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4314582069488107225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3709808271825745441/posts/default/4314582069488107225'/><link rel='alternate' type='text/html' href='http://csharp-tricks.blogspot.com/2010/10/html-seiten-mit-dem-webbrowser.html' title='HTML - Seiten mit dem Webbrowser Steuerlement aufrufen'/><author><name>Oliver</name><uri>http://www.blogger.com/profile/17789867329972474242</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_P4vFjTE5R5s/TKoFv4yoDLI/AAAAAAAAACk/pQk4ROGUFvc/s72-c/webbrowser.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37098
