<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>net-blog.net &#187; C# &amp; .net Framework</title>
	<atom:link href="http://www.net-blog.net/blog/index.php/category/informatik/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.net-blog.net/blog</link>
	<description>Informatik, Wissen und Geschichten die das Leben schreibt...</description>
	<lastBuildDate>Sat, 28 Aug 2010 19:04:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Soundcloud Downloader</title>
		<link>http://www.net-blog.net/blog/index.php/2010/08/28/soundcloud-downloader/</link>
		<comments>http://www.net-blog.net/blog/index.php/2010/08/28/soundcloud-downloader/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 19:04:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Software-Projekte]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[Downloadmanager]]></category>
		<category><![CDATA[Musik downloaden]]></category>
		<category><![CDATA[Soundcloud]]></category>
		<category><![CDATA[Soundcloud.com]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2010/08/28/soundcloud-downloader/</guid>
		<description><![CDATA[Jeden Song auf Soundcloud.com mit 3 Klicks downloaden
Als mich ein Kumpel letztens fragte, ob ich eine M&#246;glichkeit kennen w&#252;rde jeden beliebigen Song von Soundcloud.com herunterzuladen, musste ich erst mal passen. Nach ein wenig googlen stand dann fest, dass das mal wieder eine gute Vorlage f&#252;r ein neues Programm sei. Gesagt, getan – hier ist er [...]]]></description>
			<content:encoded><![CDATA[<h2>Jeden Song auf Soundcloud.com mit 3 Klicks downloaden</h2>
<p>Als mich ein Kumpel letztens fragte, ob ich eine M&#246;glichkeit kennen w&#252;rde jeden beliebigen Song von <a href="http://soundcloud.com" target="_blank">Soundcloud.com</a> herunterzuladen, musste ich erst mal passen. Nach ein wenig googlen stand dann fest, dass das mal wieder eine gute Vorlage f&#252;r ein neues Programm sei. Gesagt, getan – hier ist er – der neue <strong>Soundcloud Downloader! </strong></p>
<p>Die Handhabung gestaltet sich &#228;hnlich einfach, wie die meines <a href="http://myspace.net-blog.net" target="_blank">MySpace Loaders</a>. Da aber sicherlich einige von euch nicht mit dem MySpace Loader vertraut sind, folgt hier noch mal eine kleine Einf&#252;hrung.</p>
<p> <object width="400" height="250"><param name="movie" value="http://www.youtube-nocookie.com/v/CRuVeDG1CyY?fs=1&amp;hl=de_DE&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/CRuVeDG1CyY?fs=1&amp;hl=de_DE&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="250"></embed></object>
<p>&#160;</p>
<p>Interesse geweckt? Dann steht dem Download ja nichts mehr im Wege… <img src='http://www.net-blog.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://www.net-blog.net/blog/downloads/SoundcloudDownloader1.0.zip" target="_blank"><strong><font size="4">Download – SoundcloudDownloader.zip</font></strong></a></p>
<p>&#160;</p>
<p>Ihr habt noch Fragen, Vorschl&#228;ge, (&#196;nderungs-)w&#252;nsche oder wollt einfach nur Danke sagen? Dann schreibt mir einfach einen Kommentar oder klickt auf den Twitter- oder einen der Facebookbuttons! <img src='http://www.net-blog.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Viele Gr&#252;&#223;e,   <br /><strong><em><u>Raffi</u></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2010/08/28/soundcloud-downloader/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>C# &#8211; Facebook like MessageBox</title>
		<link>http://www.net-blog.net/blog/index.php/2010/08/09/c-facebook-like-messagebox/</link>
		<comments>http://www.net-blog.net/blog/index.php/2010/08/09/c-facebook-like-messagebox/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 22:45:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Software-Projekte]]></category>
		<category><![CDATA[AlphaBlending]]></category>
		<category><![CDATA[C#.Net]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[MessageBox]]></category>
		<category><![CDATA[ModelDialog]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2010/08/09/c-facebook-like-messagebox/</guid>
		<description><![CDATA[…eine MessageBox im “Facebook-Outfit”
 Da ich aus gegebenem Anlass demn&#228;chst ein paar Controls im Facebook-Design ben&#246;tige, habe ich mich die letzten Tage mal auf die Suche begeben und musste mit erschrecken feststellen, dass es f&#252;r Windows Forms, im Gegenteil zu diversen Ajax/ASP.NET-L&#246;sungen, eigentlich keine Controls im Facebook Design gibt.
Da ich aber m&#246;chte, dass meine erste [...]]]></description>
			<content:encoded><![CDATA[<h2>…eine MessageBox im “Facebook-Outfit”</h2>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CFacebooklikeMessageBox_386/scr_overview.png" rel="lightbox[859]"><img style="margin: 0px 15px 0px 0px; display: inline; border-width: 0px;" title="Facebook MessageBox" src="http://www.net-blog.net/blog/wp-content/uploads/CFacebooklikeMessageBox_386/scr_overview_thumb.png" border="0" alt="Facebook MessageBox" width="157" height="187" align="left" /></a> Da ich aus gegebenem Anlass demn&#228;chst ein paar Controls im Facebook-Design ben&#246;tige, habe ich mich die letzten Tage mal auf die Suche begeben und musste mit erschrecken feststellen, dass es f&#252;r Windows Forms, im Gegenteil zu diversen Ajax/ASP.NET-L&#246;sungen, eigentlich keine Controls im Facebook Design gibt.<br />
Da ich aber m&#246;chte, dass meine erste Facebook Applikation (mehr dazu bald hier im Blog) auch ordentlich dasteht – ihr wisst ja &#8211; “Kleider machen Leute…” – f&#252;hrte kein Weg daran vorbei sich selbst daran zu machen.</p>
<p>Das erste Control (es sollen weitere folgen), habe ich nun fertiggestellt und m&#246;chte es euch gerne kurz vorstellen.<br />
Es handelt sich dabei um einen Nachbau der <a href="http://msdn.microsoft.com/de-de/library/system.windows.forms.messagebox.aspx" target="_blank">MessageBox</a>, mit dem kleinen aber feinen Unterschied der Optik. Was das Handling angeht, habe ich probiert, dass sich meine L&#246;sung, welche von der <a href="http://msdn.microsoft.com/de-de/library/system.windows.forms.form%28v=VS.80%29.aspx" target="_blank">Form-Klasse</a> abgeleitet ist, m&#246;glichst wie die originale MessageBox “anf&#252;hlt”.<br />
So kann weiterhin auf die standard DialogResults zur&#252;ckgegriffen werden und auch die &#220;berladungen &#228;hneln sich sehr. (Auch wenn nicht ganz alle der 21 &#220;berladungen &#252;bernommen wurden. <img src='http://www.net-blog.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )<br />
Daf&#252;r lassen sich in meiner Variante auch eigene Grafik problemlos in Dialogen anzeigen.<br />
Wie das ganze nun ausschaut, k&#246;nnt ihr euch nachfolgend anschauen.</p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CFacebooklikeMessageBox_386/scr_overview_3.png" rel="lightbox[859]"><img style="display: inline; border-width: 0px;" title="C# MessageBox Facebookstyle" src="http://www.net-blog.net/blog/wp-content/uploads/CFacebooklikeMessageBox_386/scr_overview_thumb_3.png" border="0" alt="C# MessageBox Facebookstyle" width="420" height="315" /></a></p>
<p><strong><em>(Zum Vergr&#246;&#223;ern bitte das Bild anklicken!)</em></strong></p>
<p>Folgende &#220;berladungen sind bisher implementiert.</p>
<pre class="brush: csharp;"> MessageBoxFB.ShowDialog(string text)

MessageBoxFB.ShowDialog(string text, string caption)

MessageBoxFB.ShowDialog(string text, string caption, MessageBoxButtons buttons)

MessageBoxFB.ShowDialog(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)

MessageBoxFB.ShowDialog(string text, string caption, MessageBoxButtons buttons, Image customicon)
</pre>
<p>Zwei Anwendungsbeispiele.</p>
<pre class="brush: csharp;"> MessageBoxFB.ShowDialog(&quot;Testnachricht&quot;);

if (MessageBoxFB.ShowDialog(&quot;Sind Sie sicher?&quot;, &quot;Eine Frage&quot;, MessageBoxButtons.YesNo) == DialogResult.Yes)

{

DateiLoeschen();

} </pre>
<p>Zum Download gibt es die .Net-taugliche .dll unter folgender Url:<br />
<a title="http://www.net-blog.net/blog/downloads/FacebookControls.zip" href="http://www.net-blog.net/blog/downloads/FacebookControls.zip">http://www.net-blog.net/blog/downloads/FacebookControls.zip</a></p>
<p>Wie immer w&#252;rde ich mich &#252;ber ein konstruktives Feedback freuen. Was gef&#228;llt euch? Was k&#246;nnte man ver&#228;ndern/verbessern? Schreibt mir einfach einen Kommentar!</p>
<p>Viele Gr&#252;&#223;e,<br />
<em><span style="text-decoration: underline;"><strong>Raffi</strong></span></em></p>
<p><em>p.s.: Fairerweise muss ich noch anmerken, dass mir bei der Geschichte mit dem halb-transparenten Rand des Dialogs folgender Codeproject-Artikel sehr weitergeholfen hat.<br />
</em><a title="http://www.codeproject.com/KB/GDI-plus/perpxalpha_sharp.aspx" href="http://www.codeproject.com/KB/GDI-plus/perpxalpha_sharp.aspx"><em>http://www.codeproject.com/KB/GDI-plus/perpxalpha_sharp.aspx</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2010/08/09/c-facebook-like-messagebox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# &#8211; Webcams benutzen</title>
		<link>http://www.net-blog.net/blog/index.php/2010/06/23/c-webcams-benutzen/</link>
		<comments>http://www.net-blog.net/blog/index.php/2010/06/23/c-webcams-benutzen/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 12:35:22 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[AForge]]></category>
		<category><![CDATA[C#.Net]]></category>
		<category><![CDATA[Webcam]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2010/06/23/c-webcams-benutzen/</guid>
		<description><![CDATA[ Heute m&#246;chte ich euch zeigen, wie man mit minimalem Aufwand und wenigen Zeilen C#-Code Webcams ansteuern/nutzen kann.     Es gibt zwar schon einiges an Material zu diesem Thema, jedoch sind die meisten der Beitr&#228;ge ziemlich lang und kompliziert oder verwenden WIA Scripting welches in der h&#228;ufig vorgestellten Form nur auf Windows [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CWebcamsbenutzen_B6F0/webcam_test.png" rel="lightbox[855]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="webcam_test" border="0" alt="webcam_test" align="right" src="http://www.net-blog.net/blog/wp-content/uploads/CWebcamsbenutzen_B6F0/webcam_test_thumb.png" width="256" height="222" /></a> Heute m&#246;chte ich euch zeigen, wie man mit minimalem Aufwand und wenigen Zeilen C#-Code Webcams ansteuern/nutzen kann.     <br />Es gibt zwar schon einiges an Material zu diesem Thema, jedoch sind die meisten der Beitr&#228;ge ziemlich lang und kompliziert oder verwenden WIA Scripting welches in der h&#228;ufig vorgestellten Form nur auf Windows XP richtig rund l&#228;uft.     <br />Meine L&#246;sung&#160; basiert auf dem <a href="http://code.google.com/p/aforge/" target="_blank">AForge.NET Framework</a>. Ben&#246;tigt werden die beiden folgenden Dlls.</p>
<ul>
<li>AForge.Video.dll </li>
<li>AForge.Video.DirectShow.dll </li>
</ul>
<p>Diese findet ihr im jeweils aktuellsten “libs only” .zip-Archiv auf der <a href="http://code.google.com/p/aforge/downloads/list" target="_blank">AForge Downloadseite</a>.</p>
<h4>Designer</h4>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CWebcamsbenutzen_B6F0/verweise_hinzufuegen.png" rel="lightbox[855]"><img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="verweise_hinzufuegen" border="0" alt="verweise_hinzufuegen" align="left" src="http://www.net-blog.net/blog/wp-content/uploads/CWebcamsbenutzen_B6F0/verweise_hinzufuegen_thumb.png" width="223" height="244" /></a> Wenn ihr euch die Dlls besorgt habt, kann es auch schon losgehen. Zuerst erstellt ihr ein neues WinForms-Projekt im Visual Studio und f&#252;gt bei den Verweisen die beiden AForge Dlls hinzu.&#160; (<em>Rechtsklick auf “Verweise” &gt;&gt; “Verweis hinzuf&#252;gen” und dann im “Durchsuchen”-Tab die Dlls ausw&#228;hlen.</em>)</p>
<p>&#160;</p>
<p>Nun f&#252;gen wir unserem Form noch eine PictureBox hinzu und konfigurieren diese im “Eigenschaften”-Fenster des VS wie folgt. (<em>Eigenschaft &gt;&gt; Wert</em>)</p>
<ul>
<li>(Name) &gt;&gt; pictureBoxVideo </li>
<li>BackgroundImageLayout &gt;&gt; Zoom </li>
<li>Dock &gt;&gt; Fill </li>
</ul>
<p>Nun legen wir noch zwei Methoden f&#252;r das FormClosed- und das Load-Event unseres Forms an.    <br />Das war’s auch schon, was wir im Designer zu verrichten hatten. Nun fehlt nur noch der Code. Das dieser ziemlich kurz ist, bauen ich ihn hier im Blog nicht Schritt f&#252;r Schritt auf, sondern poste ihn, gut kommentiert, im ganzen. </p>
<h4>Code</h4>
<p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Einbinden der AForge Librarys
using AForge.Video;
using AForge.Video.DirectShow;

namespace aforgeWebcam
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Unser Webcam Objekt
        VideoCaptureDevice videoSource;

        private void Form1_Load(object sender, EventArgs e)
        {
            //Auflistung aller Webcam/Videoger&#228;te
            FilterInfoCollection videosources = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            //&#220;berpr&#252;fen, ob mindestens eine Webcam gefunden wurde
            if (videosources != null)
            {
                        //Die erste Webcam an unser Webcam Objekt binden
                        videoSource = new VideoCaptureDevice(videosources[0].MonikerString);

                        try
                        {
                            //&#220;berpr&#252;fen ob die Webcam Technische-Eigenschaften mitliefert
                            if (videoSource.VideoCapabilities.Length &gt; 0)
                            {
                                string highestSolution = &quot;0;0&quot;;
                                //Das Profil mit der h&#246;chsten Aufl&#246;sung suchen
                                for (int i = 0; i &lt; videoSource.VideoCapabilities.Length; i++)
                                {
                                    if (videoSource.VideoCapabilities[i].FrameSize.Width &gt; Convert.ToInt32(highestSolution.Split(';')[0]))
                                        highestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + &quot;;&quot; + i.ToString();
                                }
                                //Dem Webcam Objekt die h&#246;chstm&#246;gliche Aufl&#246;sung &#252;bergeben
                                videoSource.DesiredFrameSize = videoSource.VideoCapabilities[Convert.ToInt32(highestSolution.Split(';')[1])].FrameSize;
                            }
                        }
                        catch { }

                        //Dem Webcam Objekt den NewFrame Eventhandler zuweisen.
                        //Dieser schl&#228;gt bei jedem eingehenden Bild der Webcam an
                        videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);

                        //Die Webcam aktivieren
                        videoSource.Start();
            }

        }

        void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            //Jedes ankommende Bild von der Webcam der Picturebox zuweisen
            pictureBoxVideo.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Webcam beim Schlie&#223;en des Programms wieder freigeben
            if (videoSource != null &amp;&amp; videoSource.IsRunning)
            {
                videoSource.SignalToStop();
                videoSource = null;
            }
        }

    }
}
</pre>
</p>
<p>&#160;</p>
<p>Das war’s auch schon. Abschlie&#223;end k&#246;nnt ihr das <a href="http://www.net-blog.net/blog/downloads/aforgeWebcam.zip" target="_blank">Demo-Projekt auch hier downloaden</a>. Solltet ihr noch Fragen, Kritik oder Verbesserungsvorschl&#228;ge haben, dann schreibt mir einfach einen Kommentar.</p>
<p>&#160;</p>
<p>Viele Gr&#252;&#223;e,   <br /><strong><em><u>Raffi</u></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2010/06/23/c-webcams-benutzen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C# &#8211; Webbrowser Control: Popups blocken</title>
		<link>http://www.net-blog.net/blog/index.php/2010/03/11/c-webbrowser-control-popups-blocken/</link>
		<comments>http://www.net-blog.net/blog/index.php/2010/03/11/c-webbrowser-control-popups-blocken/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 12:38:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Popups]]></category>
		<category><![CDATA[webbrowser control]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2010/03/11/c-webbrowser-control-popups-blocken/</guid>
		<description><![CDATA[Mal schnell ein kleiner Tipp aus der C# Ecke. Popups nerven – vor allem, wenn das Webbrowsercontrol unsichtbar ist und eine Anwendung, dem User v&#246;llig unersichtlich, eben diese generiert/zul&#228;sst.    Nach endlosem googlen und herum probieren musste ich mal wieder feststellen, wie simpel und einfach das Leben Mit C# und Visual Studio doch [...]]]></description>
			<content:encoded><![CDATA[<p>Mal schnell ein kleiner Tipp aus der C# Ecke. Popups nerven – vor allem, wenn das Webbrowsercontrol unsichtbar ist und eine Anwendung, dem User v&#246;llig unersichtlich, eben diese generiert/zul&#228;sst.    <br />Nach endlosem googlen und herum probieren musste ich mal wieder feststellen, wie simpel und einfach das Leben Mit C# und Visual Studio doch ist.</p>
<p>Also – wie blockt man Popups, die von einem Webbrowser Control ausgehen?</p>
<p>Um die Popups zu blocken muss dem Webbrowser Control zuerst ein NewWindow Eventhandler hinzugef&#252;gt werden. Ob ihr dies von Hand, oder &#252;ber die Property Box macht, ist ja bekannter weise egal. <img src='http://www.net-blog.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CWebbrowserControlPopupsblocken_BB83/newwindowhandler.png" rel="lightbox[782]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="newwindowhandler" border="0" alt="newwindowhandler" src="http://www.net-blog.net/blog/wp-content/uploads/CWebbrowserControlPopupsblocken_BB83/newwindowhandler_thumb.png" width="168" height="244" /></a> </p>
<p>Im zweiten Schritt reicht dann schon eine einzige Zeile Code, um die Popups in die ewigen Jagdgr&#252;nde zu schicken.</p>
<p><pre class="brush: csharp;">
private void webBrowser2_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
}
</pre>
</p>
<p>Also – Popups ade!</p>
<p> 
<p>Viele Gr&#252;&#223;e,    <br /><strong><em><u>Raffi</u></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2010/03/11/c-webbrowser-control-popups-blocken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# ContextMenuStrip &#246;ffnen, ohne es in der Taskbar anzuzeigen</title>
		<link>http://www.net-blog.net/blog/index.php/2009/11/28/c-contextmenustrip-ffnen-ohne-es-in-der-taskbar-anzuzeigen/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/11/28/c-contextmenustrip-ffnen-ohne-es-in-der-taskbar-anzuzeigen/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 13:29:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[C#.Net]]></category>
		<category><![CDATA[ContextMenuStrip]]></category>
		<category><![CDATA[Taskbar]]></category>
		<category><![CDATA[TrayIcon]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2009/11/28/c-contextmenustrip-ffnen-ohne-es-in-der-taskbar-anzuzeigen/</guid>
		<description><![CDATA[	NotifyIcon ContextMenu ohne Rechtsklick &#246;ffnen

	Wieder mal ein Beispiel aus der Kategorie &#8220;Kleiner Code, gro&#223;er Effekt&#8221;. 
	Hat man eine Tray-Anwendung und m&#246;chte, dass das ContextMenu zum Beispiel auch &#252;ber einen Doppelklick aufgerufen werden kann, so wird man schmerzlich feststellen, dass ein Aufruf al&#225; ContextMenuStrip.Show() im DoubleClick-Event des NotifyIcon leider auch ein Anzeigen des ContextMenuStrips in der [...]]]></description>
			<content:encoded><![CDATA[<h2>
	NotifyIcon ContextMenu ohne Rechtsklick &ouml;ffnen</h2>
<p>
	Wieder mal ein Beispiel aus der Kategorie &ldquo;Kleiner Code, gro&szlig;er Effekt&rdquo;. <br />
	Hat man eine Tray-Anwendung und m&ouml;chte, dass das ContextMenu zum Beispiel auch &uuml;ber einen Doppelklick aufgerufen werden kann, so wird man schmerzlich feststellen, dass ein Aufruf al&aacute; ContextMenuStrip.Show() im DoubleClick-Event des NotifyIcon leider auch ein Anzeigen des ContextMenuStrips in der Taskleiste mit sich bringt.</p>
<p>
	Um das ContextMenu &uuml;ber einen beliebigen beliebigen Click-Eventhandler eines NotifyIcon anzuzeigen, ohne dass es zus&auml;tzlich in der Taskbar angezeigt wird, ist folgender Code notwendig:</p>
<p><pre class="brush: csharp;">private void ShowContextMenu(NotifyIcon nI, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Right)
            {
                nI.GetType().InvokeMember(
                &quot;ShowContextMenu&quot;,
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                null,
                nI,
                null
                );
            }
        }</pre>
</p>
<p>
	&nbsp;</p>
<p>
	Am Beispiel eines Doppelklicks auf mein NotifyIcon <em>TrayIcon </em>s&auml;he das dann wie folgt aus:</p>
<p><pre class="brush: csharp;">private void TrayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ShowContextMenu((NotifyIcon)sender, e);
        }</pre>
</p>
<p>
	Ich hoffe es hilft dem ein oder anderen von euch!</p>
<p>
	viele Gr&uuml;&szlig;e, <br />
	<strong><em><u>euer Raffi</u></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/11/28/c-contextmenustrip-ffnen-ohne-es-in-der-taskbar-anzuzeigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatisch eine Klasse f&#252;r den Zugriff auf eine XML-Datei erstellen</title>
		<link>http://www.net-blog.net/blog/index.php/2009/10/12/automatisch-eine-klasse-fr-den-zugriff-auf-eine-xml-datei-erstellen/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/10/12/automatisch-eine-klasse-fr-den-zugriff-auf-eine-xml-datei-erstellen/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 22:46:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML Deserialisierung]]></category>
		<category><![CDATA[XML Serialisierung]]></category>
		<category><![CDATA[XSD]]></category>
		<category><![CDATA[xsd.exe]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2009/10/12/automatisch-eine-klasse-fr-den-zugriff-auf-eine-xml-datei-erstellen/</guid>
		<description><![CDATA[Klassen generieren mit der XSD.exe
Bis vor kurzer Zeit schrieb ich mir s&#228;mtlichen Code f&#252;r den Zugriff auf XML Dateien mit Hilfe der vom .Net Framework bereitgestellten Klassen m&#252;hselig von Hand zusammen. Wie gesagt – bis vor kurzem.
Da ich zu Hause nur mit der kostenlosen Express Edition des Visual Studio arbeite lief mir die xsd.exe bisher [...]]]></description>
			<content:encoded><![CDATA[<h2>Klassen generieren mit der XSD.exe</h2>
<p>Bis vor kurzer Zeit schrieb ich mir s&#228;mtlichen Code f&#252;r den Zugriff auf <a href="http://de.wikipedia.org/wiki/Xml" target="_blank">XML Dateien</a> mit Hilfe der vom .Net Framework bereitgestellten Klassen m&#252;hselig von Hand zusammen. Wie gesagt – bis vor kurzem.</p>
<p>Da ich zu Hause nur mit der kostenlosen Express Edition des Visual Studio arbeite lief mir die <a href="http://msdn.microsoft.com/de-de/library/x6c1kb0s(VS.80).aspx" target="_blank">xsd.exe</a> bisher nicht &#252;ber den Weg. Dabei erspart sie einem bei dem Zugriff auf XML-Dateien eine Menge Arbeit. So l&#228;sst sich mittels dieser .exe im Handumdrehen eine Klasse aus einer beliebigen XML-Datei generieren, die den Zugriff auf eben diese um Welten erleichtert. Wie das funktioniert m&#246;chte ich euch im folgenden anhand des <a href="http://www.tagesschau.de/xml/tagesschau-meldungen/" target="_blank">ARD Tagesschau Feeds</a> zeigen. <em>(Bilder zum Vergr&#246;&#223;ern einfach anklicken. )</em></p>
<p><u><font size="2"><strong>1 – Feed speichern</strong></font></u></p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/feed_speichern_firefox.jpg" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="feed_speichern_firefox" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/feed_speichern_firefox_thumb.jpg" border="0" alt="feed_speichern_firefox" width="244" height="181" align="left" /></a> Als erstes speichern wir den besagten <a href="http://www.tagesschau.de/xml/tagesschau-meldungen/" target="_blank">Feed</a> als XML Datei ab. Dazu &#246;ffnet ihr den Feed einfach in eurem Browser und klickt im Men&#252; auf “Seite speichern unter”.<br />
In manchen Browsern, wie zum Beispiel im Firefox, m&#252;sst ihr beim Speichern noch die Datei Endung auf .xml anpassen.</p>
<p><u><font size="2"><strong>2a – Konsole &#246;ffnen (Visual Studio Express Edition)</strong></font></u></p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/cmd_microsoft_sdk.png" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="cmd_microsoft_sdk" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/cmd_microsoft_sdk_thumb.png" border="0" alt="cmd_microsoft_sdk" width="244" height="125" align="left" /></a> &#214;ffnet die Konsole<br />
(<em>Start &gt;&gt; Ausf&#252;hren &gt;&gt; cmd</em>)<br />
und wechselt in den “bin”-Ordner<br />
des Microsoft SDKs.<br />
Normalerweise findet ihr<br />
diesen an folgender Stelle:</p>
<p>“C:\Programme\Microsoft SDKs\Windows\{version}\bin”</p>
<p><strong><u><font size="2">2b – Konsole &#246;ffnen (Visual Studio Professional, Enterprise, etc. Edition)</font></u></strong></p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/visual_studio_tools_command_prompt.jpg" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="visual_studio_tools_command_prompt" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/visual_studio_tools_command_prompt_thumb.jpg" border="0" alt="visual_studio_tools_command_prompt" width="244" height="174" align="left" /></a> &#214;ffnet die Visual Studio Tools Konsole.</p>
<p><u><strong><font size="2">3 – XML-Datei –&gt; XSD Schema –&gt; Klasse</font></strong></u></p>
<p><em>(Um elendig langen Pfadangaben aus dem Weg zu gehen habe ich die in Schritt 1 gespeicherte XML-Datei in einen hierf&#252;r angelegten Ordner “xml” auf Laufwerk C:\ abgelegt.)<br />
</em>Als n&#228;chstes generieren wir ein XSD Schema aus unserer XML-Datei. Hierf&#252;r geben wir folgenden Befehl in die Konsole ein.</p>
<blockquote><p>xsd c:\xml\index.xml /outputdir:c:\xml</p></blockquote>
<p>Um aus der soeben erstellen .xsd-Datei unsere gew&#252;nschte Klasse zu generieren ist nun nur noch folgender Aufruf n&#246;tig.</p>
<blockquote><p>xsd c:\xml\index.xsd /outputdir:c:\xml /classes</p></blockquote>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/xsd_generieren.jpg" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="xsd_generieren" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/xsd_generieren_thumb.jpg" border="0" alt="xsd_generieren" width="244" height="129" /></a></p>
<p>Das war es eigentlich schon. Nun haben wir aus unserer XML-Datei ein XSD Schema und daraus eine Klasse f&#252;r die Verwendung in C#.Net erstellt. Was genau man damit anstellen kann folgt im n&#228;chsten Schritt.</p>
<p><font size="2"><strong><u>4 – Verwendung und Aufruf der generierten Klasse</u></strong></font></p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/rss_reader_design.jpg" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="rss_reader_design" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/rss_reader_design_thumb.jpg" border="0" alt="rss_reader_design" width="244" height="116" align="left" /></a> Um euch zu demonstrieren, wie und an welcher Stelle man die generierte Klasse sinnvoll nutzen kann habe ich eine kleine Testapplikation erstellt.<br />
Da wir uns in diesem Tutorial als Test-XML an dem RSS Feed der Tagesschau vergriffen haben, liegt es nahe einen kleinen Nachrichtenleser zu basteln.</p>
<p>Legt also ein neues Windows Forms Projekt an und stattet eurer Main Form mit den folgenden vier Controls aus:</p>
<ul>
<li>ListBox</li>
<li>Label</li>
<li>RichTextBox</li>
<li>Linklabel</li>
</ul>
<p>Im n&#228;chsten Schritt binden wir die generierte Klasse ein. Hierzu reicht ein Rechtsklick im Projektexplorer auf unserer Projekt und dann ein Linksklick auf “vorhandenes Element hinzuf&#252;gen”. Nun nur noch schnell die erstelle Klasse ausw&#228;hlen und mit Ok best&#228;tigen.<br />
Jetzt binden wir den Namespace System.Net ein, definieren 2 Variablen, einen String namens Link, sowie ein rss object unserer generierten Klasse und legen das Load Event unseres Main Forms, das Click Event der ListBox und das LinkClicked Event des LinkLabels an. Der Code eures Main Forms sollte nun wie folgt aussehen.</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;

namespace XsdTutorial
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

 private rss rssbase;
 private string link;

 private void Form1_Load(object sender, EventArgs e)
 {

 }

 private void listBoxPosts_Click(object sender, EventArgs e)
 {

 }

 private void linkLabelPost_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {

 }
 }
}
</pre>
<p>Im n&#228;chsten Schritt bef&#252;llen wir die Events. Die Erkl&#228;rungen hierzu entnehmt ihr bitte den Kommentaren im Code. Sollten sich Fragen auftun, dann schreibt bitte einen Kommentar!</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;

namespace XsdTutorial
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

 private rss rssbase;
 private string link;

 private void Form1_Load(object sender, EventArgs e)
 {
 //Erstelle HttpWebRequest f&#252;r den Taggeschau Feed
 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(&quot;http://www.tagesschau.de/xml/tagesschau-meldungen/&quot;);
 HttpWebResponse res = (HttpWebResponse)req.GetResponse();

 //Lege Kodierung fest, damit Sonderzeichen richtig angezeigt werden.
 //Der passende Encoding String ist dem Header des Feeds zu entnehmen.
 //(Im Browser: Rechtsklick &gt;&gt; Quelltext anzeigen)
 Encoding encode = System.Text.Encoding.GetEncoding(&quot;ISO-8859-1&quot;);

 //&#214;ffne einen Streamreader mit dem Response Stream, der den Feed enth&#228;lt
 //und lege Kodierung fest.
 System.IO.StreamReader str = new System.IO.StreamReader(res.GetResponseStream(), encode);

 //Initialisiere einen XMLSerializer mit dem Schema (typeof(rss)) unseres Feeds.
 System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(rss));

 //Deserialisiere unsere Feed nach dem Schema.
 rssbase = (rss)xSerializer.Deserialize(str);

 //Gibt an ob es sich um das erste Objekt in der folgenden Schleife handelt.
 bool first = true;

 //Durchlaufe alle Items. Jedes Item enth&#228;lt die Elemente
 //(Titel, Beschreibung, etc.) einer Nachricht des Feeds
 foreach (rssChannelItem item in rssbase.channel[0].item)
 {
 if (first)
 {
 //Weise die Daten des ersten Items unseren
 //Controls zu.
 first = false;
 labelTitel.Text = item.title;
 richTextBoxMessage.Text = item.description;
 link = item.link;
 }
 //F&#252;ge der ListBox einen Eintrag mit dem Titel
 //der aktuellen Nachricht hinzu.
 listBoxPosts.Items.Add(item.title);
 }
 str.Close();
 }

 private void listBoxPosts_Click(object sender, EventArgs e)
 {
 //Durchlaufe alle Items/Nachrichten des Feeds
 foreach (rssChannelItem item in rssbase.channel[0].item)
 {
 if (item.title == listBoxPosts.SelectedItem.ToString())
 {
 //Entspricht die aktuelle Nachricht der in der Listbox
 //angeklickten, so weise den Controls die entsprechenden
 //Werte zu.
 labelTitel.Text = item.title;
 richTextBoxMessage.Text = item.description;
 link = item.link;
 }
 }
 }

 private void linkLabelPost_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {
 //Rufe den angeklickten Link im Standard Browser auf
 System.Diagnostics.Process.Start(link);
 }
 }
}
</pre>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/feed_reader_ready.jpg" rel="lightbox[670]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="feed_reader_ready" src="http://www.net-blog.net/blog/wp-content/uploads/AutomatischeineKlassefrdenZugriffaufeine_EECD/feed_reader_ready_thumb.jpg" border="0" alt="feed_reader_ready" width="244" height="113" align="left" /></a> An dieser Stelle sind wir eigentlich schon fertig. Wenn nichts schief gelaufen ist, dann sollte sich euch nach einem Druck auf die F5-Taste ein &#228;hnlicher Anblick, wie auf dem Bild, bieten.</p>
<p>Durch klicken auf die &#220;berschriften in der ListBox k&#246;nnt ihr euch eine Vorschau der jeweiligen Nachricht anzeigen lassen. Mit einem Klick auf das Linklabel – ich habe ihm den Text “weiterlesen…” gegeben – gelangt ihr zur Originalversion der Nachricht.</p>
<p>Soweit alles klar? Kamt ihr zurecht? Hinterlasst mir einen Kommentar!</p>
<p>Liebe Gr&#252;&#223;e,<br />
<strong><em><span style="text-decoration: underline;">Raffi</span></em></strong></p>
<p><strong><em> </em></strong></p>
<p>p.s.: Leider weist die xsd.exe einen kleinen Bug auf, was verschachtelte Elemente beziehungsweise JaggedArrays angeht. Solltet ihr bei euren Versuchen dar&#252;ber stolpern, schaut die Tage noch mal rein. Ein kleines Workaround diesbez&#252;glich wird folgen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/10/12/automatisch-eine-klasse-fr-den-zugriff-auf-eine-xml-datei-erstellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regex r&#252;ckw&#228;rts &#8211; erst das Match, dann das Pattern</title>
		<link>http://www.net-blog.net/blog/index.php/2009/10/06/regex-rckwrts-erst-das-match-dann-das-pattern/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/10/06/regex-rckwrts-erst-das-match-dann-das-pattern/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 21:49:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[C#.Net]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[Reguläre Ausdrücke]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2009/10/06/regex-rckwrts-erst-das-match-dann-das-pattern/</guid>
		<description><![CDATA[Online RegEx Pattern Generator
 Heute geht’s um RegEx (Regular Expressions –&#62; Regul&#228;re Ausdr&#252;cke). Der eine mag sie, der andere wohl eher nicht. Aber eines ist klar, wenn das Pattern/die Pattern erst mal stehen, dann ersparen sie einem eine Menge Arbeit.    Bis dahin ist es manchmal jedoch ein recht beschwerlicher Weg und auch [...]]]></description>
			<content:encoded><![CDATA[<h2>Online RegEx Pattern Generator</h2>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/RegexrckwrtserstdasMatchdanndasPattern_143C8/important128x128.png" rel="lightbox[660]"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="important-128x128" border="0" alt="important-128x128" align="left" src="http://www.net-blog.net/blog/wp-content/uploads/RegexrckwrtserstdasMatchdanndasPattern_143C8/important128x128_thumb.png" width="128" height="171" /></a> Heute geht’s um RegEx (<a href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank">Regular Expressions –&gt; Regul&#228;re Ausdr&#252;cke</a>). Der eine mag sie, der <a href="http://twitter.com/desti77/status/3446821801" target="_blank">andere</a> wohl eher nicht. Aber eines ist klar, wenn das Pattern/die Pattern erst mal stehen, dann ersparen sie einem eine Menge Arbeit.    <br />Bis dahin ist es manchmal jedoch ein recht beschwerlicher Weg und auch ich, obwohl ich mich eigentlich zu den Leuten z&#228;hle die RegEx m&#246;gen, habe schon das ein oder andere Mal f&#252;rchterlich geflucht, wenn das Pattern auch beim 50ten Mal noch nicht richtig gematched hat.</p>
<p>Deshalb m&#246;chte ich euch heute auf eine <a href="http://www.txt2re.com/" target="_blank">Webseite</a> hinweisen, auf der ihr euch euer passendes Pattern zusammenklicken k&#246;nnt. Auf <a href="http://www.txt2re.com/" target="_blank">txt2re</a> gebt ihr euren zu untersuchenden String ein und k&#246;nnt danach anklicken, welche Teile davon gematched (schreibt man das eigentlich so und wie hei&#223;t das deutsche <a href="http://www.fremdwort.de/suche.php?term=pendant" target="_blank">Pendant</a> dazu?) werden sollen. </p>
<p>Habt ihr alles konfiguriert k&#246;nnt ihr euch mit einem Klick das passende Pattern wahlweise in C#.Net, Perl, PHP, Python, Java, Javascript, ColdFusion, C, C++, Ruby, VB, VBScript, J#, C++.Net, oder VB.net anzeigen lassen.</p>
<p>Ok, zugegeben die Patterns sind nicht gerade schlank, aber dazu kann man das ganze zum Beispiel ja noch mit dem <a href="http://www.mycsharp.de/wbb2/thread.php?threadid=21580" target="_blank">Regex-Lab</a> von herbivore testen und optimieren.</p>
<p>Wer generell noch Lesebedarf hat, oder sein Wissen um die Verwendung in C# und den Grundlegenden Aufbau noch etwas auffrischen mag, kann sich zum Beispiel <a href="http://www.mycsharp.de/wbb2/thread.php?threadid=41009" target="_blank">das Tutorial</a> von webstarg zu Gem&#252;te f&#252;hren.</p>
<p>Wie sieht das eigentlich bei euch aus? M&#246;gt ihr RegEx und wie oft ben&#246;tigt ihr sie &#252;berhaupt?</p>
<p>Liebe Gr&#252;&#223;e,   <br /><strong><em><u>Raffi</u></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/10/06/regex-rckwrts-erst-das-match-dann-das-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# &#8211; Login auf Webseiten per HttpWebRequest und HttpWebResponse</title>
		<link>http://www.net-blog.net/blog/index.php/2009/09/30/c-login-auf-webseiten-per-httpwebrequest-und-httpwebresponse/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/09/30/c-login-auf-webseiten-per-httpwebrequest-und-httpwebresponse/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 13:02:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[autologin]]></category>
		<category><![CDATA[HttpWebRequest]]></category>
		<category><![CDATA[HttpWebResponse]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[System.Net]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2009/09/30/c-login-auf-webseiten-per-httpwebrequest-und-httpwebresponse/</guid>
		<description><![CDATA[…Http-Requests mitschneiden, analysieren und reproduzieren
Heute folgt endlich der langersehnte zweite Teil der Miniserie, die sich damit besch&#228;ftigt, wie man sich mittels C# auf Webseiten einloggen kann beziehungsweise an durch einen Login gesch&#252;tzten Quelltext kommt. Nachdem im ersten Teil Arcor.de als Testseite diente, nehmen wir dieses mal StudiVZ.net zum testen unseres Programms. Im Gegenteil zum ersten [...]]]></description>
			<content:encoded><![CDATA[<h2>…Http-Requests mitschneiden, analysieren und reproduzieren</h2>
<p>Heute folgt endlich der langersehnte zweite Teil der Miniserie, die sich damit besch&#228;ftigt, wie man sich mittels C# auf Webseiten einloggen kann beziehungsweise an durch einen Login gesch&#252;tzten Quelltext kommt. Nachdem im <a href="http://www.net-blog.net/blog/index.php/2009/03/16/c-automatischer-login-mit-dem-webbrowser-control/" target="_blank">ersten Teil</a> <a href="http://arcor.de" target="_blank">Arcor.de</a> als Testseite diente, nehmen wir dieses mal <a href="http://studivz.net" target="_blank">StudiVZ.net</a> zum testen unseres Programms. Im Gegenteil zum ersten Mal bedienen wir uns heute jedoch der Klassen HttpWebRequest und HttpWebResponse aus dem System.Net Namespace, statt des WebbrowserControls.</p>
<p>Am Anfang steht die &#220;berlegung, wie die Oberfl&#228;che unseres Testprogramms aussehen m&#252;sste, damit sie unsere Zwecke zwar ausreichend erf&#252;llt, dabei aber nicht &#252;berm&#228;&#223;ig mit Controls belegt wird. Denn in diesem Artikel wollen wir uns nur auf das n&#246;tigste beschr&#228;nken.<br />
Meiner Meinung nach reicht ein Form mit zwei Buttons und einem WebbrowserControl vollkommen aus.</p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_1.jpg" rel="lightbox[652]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="csharp_login_tutorial_1" src="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_1_thumb.jpg" border="0" alt="csharp_login_tutorial_1" width="244" height="171" align="left" /></a>Ein Klick auf den linken Button, soll den Quelltext der gesch&#252;tzten Seite (mein StudiVZ Profil) in einen String schreiben und diesen dann im WebbrowserControl anzeigen.<br />
Ein Klick auf den rechten Button soll uns im StudiVZ einloggen.<br />
Das WebbrowserControl dient uns heute nur passiv zur schnellen Kontrolle unserer Funktionen. Denn klicken wir auf den linken Button, ohne das wir uns vorher eingeloggt haben, so sehen wir im WebbrowserControl nur die Aufforderung uns einzuloggen. Klicken wir zuerst auf den rechten und dann auf den linken Button, so sehen wir mein VZ-Profil. Auf diese Weise k&#246;nnen wir schnell und einfach nachvollziehen, ob der Loginvorgang erfolgreich war.</p>
<p><span id="more-652"></span>Solltet ihr euch noch kein neues Projekt angelegt haben, legt dieses bitte nun an und klickt euch die Oberfl&#228;che im Visual Studio (oder der <a href="http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung" target="_blank">IDE</a> eure Vertrauens) zusammen. (Denkt bitte daran die Eigenschaft <em>ScriptErrorsSuppressed </em>des WebbrowserControls auf <em>true</em> zu stellen, damit wir nicht mit unsch&#246;nen Errors im Script der angezeigten Seite konfrontiert werden.)</p>
<p>Als n&#228;chstes schreiben wir die Funktionalit&#228;t f&#252;r unseren linken Button. Hierzu macht ihr bitte einfach einen Doppelklick auf das ButtonControl, oder erstellt euch den Click-Eventhandler samt Event von Hand. Ebenso ist es sinnvoll die Namespaces System.Net und System.IO einzubinden.</p>
<p>Da beim Klick auf den linken Button ja mein StudiVZ Profil geladen werden soll, ben&#246;tigen wir also eine “Funktion”, die den Quelltext zur Verf&#252;gung stellt, damit wir ihn im WebbrowserControl anzeigen k&#246;nnen.<br />
Hierf&#252;r erstellen wir eine neue Klasse, damit wir z.B. die HttpWebRequest Klasse im sp&#228;teren Verlauf nicht mehrmals deklarieren m&#252;ssen.<br />
Bevor jetzt eventuell die ersten schon nicht mehr folgen k&#246;nnen, hier noch mal schnell die Codeansicht zum jetzigen Zeitpunkt.</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace LoginTutorial
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

 private void buttonProfilAufrufen_Click(object sender, EventArgs e)
 {
 webBrowser1.DocumentText = httpHelper.GetHtml(&quot;http://www.studivz.net/Profile/300ee964aa102c6d&quot;);
 }

 }

 class HttpHelper
 {
 }
}
</pre>
<p>Nun basteln wir uns innerhalb der neulangelegten Klasse unsere Funktion, die den Quelltext meiner Profilseite anfordern soll. Zuerst deklarieren wir noch einen CookieContainer, einen HttpWebRequest, einen HttpWebResponse, sowie einen Streamreader in der HttpHelper Klasse. Nun legen wir unsere Funktion zum holen des Quelltext an, nennen diese GetHtml und legen fest, dass diese einen String namens Url annehmen soll, damit wir der Funktion beim Aufruf die Adresse meines Profils &#252;bergeben k&#246;nnen.<br />
Jetzt initialisieren wir den eben deklarierten HttpWebRequest in unserer Funktion und weisem ihm &#252;ber seine Create Methode die Url zu. Daraufhin legen wir weitere Parameter fest, die ihr in der n&#228;chsten Codeansicht nachschauen k&#246;nnt.<br />
Schlussendlich initialisieren wir den HttpWebResponse, wobei wir den Request als HttpWebResponse casten und forden daraufhin den Quelltext an, den wir per Return nach dem Erhalt zur&#252;ckgeben. <strong>Nichts verstanden? </strong>Dann einfach mal den entsprechenden Code anschauen…</p>
<pre class="brush: csharp;">
class HttpHelper
{

//Zuerst deklarieren wir die vier obengenannten n&#246;tigen  Klassen/Objekte
private CookieContainer cookieContainer = new  CookieContainer();
HttpWebRequest request;
HttpWebResponse  response;
StreamReader sr;

public string GetHtml(string Url)
{

//Dann initialisieren wir den httpWebRequest und weisem ihm die  n&#246;tigen
//Parameter zu
request =  (HttpWebRequest)HttpWebRequest.Create(Url);
request.CookieContainer =  cookieContainer;
request.Method = &quot;GET&quot;;
request.UserAgent = &quot;Mozilla/5.0  (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122  Firefox/3.0.5&quot;;

//Hier initialisieren wir den HttWebResponse und casten dazu unser  Request

response = (HttpWebResponse)request.GetResponse();
sr = new  StreamReader(response.GetResponseStream());
//Zuletzt laden wir den Quelltext  und weisen ihn dem
//zur&#252;ckzugebenen String zu
string html =  sr.ReadToEnd();
sr.Close();
response.Close();

return html;
}

}
</pre>
<p>Wenn wir das erledigt haben, initialisieren wir die HttpHelper Klasse in unserer Hauptklasse und rufen die GetHtml Methode mit der korrekten Url (zu meinem Profil) im Click-Event des linken Buttons auf. Das schaut dann wie folgt aus.</p>
<pre class="brush: csharp;">
…
public Form1()
{
InitializeComponent();
}
HttpHelper httpHelper  = new HttpHelper();

…

private void buttonProfilAufrufen_Click(object sender, EventArgs  e)
{
webBrowser1.DocumentText =  httpHelper.GetHtml(&quot;http://www.studivz.net/Profile/300ee964aa102c6d&quot;);
}
</pre>
<p>Wer mag, kann das bisher geschriebene einfach mal durch den Compiler jagen (F5-Taste) und sich das Ergebnis ansehen. Klickt ihr nun auf den linken Button, so solltet ihr nach kurzer Zeit eine StudiVZ Seite sehen, die euch auffordert euch einzuloggen.<br />
Sollte das der Fall sein, so habt ihr bis jetzt alles richtig gemacht.</p>
<p>Jetzt fehlt nur noch die Methode zum Einloggen. Um diese zu erstellen f&#252;hren wir im Firefox einen Loginvorgang durch und analysieren diesen. Hierzu ben&#246;tigen wir ein Plugin, mit dem wir die Http-Requests, die beim Loginvorgang gesendet werden, mitloggen k&#246;nnen. Ich habe mich dabei f&#252;r <a href="https://addons.mozilla.org/de/firefox/addon/3829" target="_blank">Live Http Headers</a> entschieden.</p>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_2.jpg" rel="lightbox[652]"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="csharp_login_tutorial_2" src="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_2_thumb.jpg" border="0" alt="csharp_login_tutorial_2" width="244" height="169" align="right" /></a>Nach dem ihr das Plugin installiert habt, ruft ihr im Firefox <a href="http://studivz.net">http://studivz.net</a> auf und &#246;ffnet LiveHttpHeaders.<br />
(siehe Screenshot)</p>
<p>Nun gebt ihr eure Zugangsdaten ein und klickt auf einloggen. W&#228;hrend des Logins erscheint ein Haufen Text im LiveHttpHeaders Fenster. Lasst euch davon nicht verwirren! Ist der Login abgeschlossen, was ihr daran merkt, dass LiveHttpHeaders dem Protokoll nichts mehr hinzuf&#252;gt, scrollen wir im LiveHttpHeaders Fenster nach ganz oben. Dort steht alles was wir f&#252;r unseren Login ben&#246;tigen. Die genaue <a href="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_3.jpg" rel="lightbox[652]"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="csharp_login_tutorial_3" src="http://www.net-blog.net/blog/wp-content/uploads/CLoginaufWebseitenperHttpWebRequestundHt_12B69/csharp_login_tutorial_3_thumb.jpg" border="0" alt="csharp_login_tutorial_3" width="244" height="103" align="left" /></a>Aufschl&#252;sselung entnehmt ihr bitte dem Screenshot und der nachfolgenden Liste.</p>
<ol>
<li>Enth&#228;lt die Url, an die wir unseren Request schicken m&#252;ssen</li>
<li>Enth&#228;lt die Request Methode (Post oder Get) in unserem Fall Post</li>
<li>Enth&#228;lt den User-Agent der mitgesendet wird (Wir werden jedoch weiterhin den kurzen User-Agent benutzen, den wir auch f&#252;r unsere GetHtml Funktion genommen haben.)</li>
<li>Enth&#228;lt den Content-Type des Requests</li>
<li>Enth&#228;lt die Content-Length des Requests (Diese werden wir sp&#228;ter selbst bestimmen, da diese je nach L&#228;nge des Contentstrings (siehe 6.) unterschiedlich ist.</li>
<li>Enth&#228;lt den &#252;bergebenen Content. Die l&#228;nge dieses Contentstrings variiert je nach username und password.</li>
</ol>
<p>Jetzt setzen wir die gewonnenen Erkenntnisse in Form der LoginMethode in C# um.<br />
Wir erstellen eine Methode, nennen diese LogIn und weisen ihr im Kostruktor einen String zu, der sp&#228;ter beim Aufruf den Contentstring enhalten soll. Danach initialisieren wir, wie schon bei der GetHtml Methode, unser HttpWebRequest, weisen diesem dabei unsere Zielurl (Punkt 1) zu und setzen den CookieContainer, sowie den User-Agent (Punkt 3). Weiter weisen wir der Method Eigenschaft unseres HttpWebRequests den String “Post” (Punkt 2) und der ContentType Eigenschaft den String “application/x-www-form-urlencoded” (Punkt 4) zu. Um die ContentLength Eigenschaft zu bestimmen m&#252;ssen wir unseren Contentstring per ASCIIEncoding in ein Byte-Array einlesen. Die Length Eigenschaft dieses Arrays definiert gleichzeit die ContentLength Eigenschaft unseres HttpRequests.<br />
Als letztes f&#252;gen wir unseren Contentstring hinzu, indem wir einen Stream auf Basis der GetRequestStream Methode unseres HttpWebRequests initialiseren und in diesen unser ContentString-Byte-Array schreiben.<br />
Nun m&#252;ssen wir unser Request nur noch “absenden”. Hierzu initialisieren wir die HttpWebResponse der HttpHelper-Klasse mit Hilfe der GetResponse Methode unseres HttpWebRequests. Wer mag kann ganz zum Schluss noch eine MessageBox einbauen um sp&#228;ter im laufenden Betrieb benachrichtigt zu werden, wenn der Login abgeschlossen ist.</p>
<p>Das Ganze sollte jetzt in etwa so aussehen:</p>
<pre class="brush: csharp;">
public void LogIn(string LoginString)
{

request = (HttpWebRequest)HttpWebRequest.Create(&quot;&lt;a  href=&quot;https://secure.studivz.net/Login%22%29;&quot;&gt;https://secure.studivz.net/Login&quot;);&lt;/a&gt;
request.CookieContainer  = cookieContainer;
request.Method = &quot;POST&quot;;
request.UserAgent =  &quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122  Firefox/3.0.5&quot;;
request.ContentType =  &quot;application/x-www-form-urlencoded&quot;;
ASCIIEncoding encoding = new  ASCIIEncoding();
byte[] loginDataBytes =  encoding.GetBytes(LoginString);
request.ContentLength =  loginDataBytes.Length;

Stream stream = request.GetRequestStream();
stream.Write(loginDataBytes,  0, loginDataBytes.Length);
stream.Close();

response =  (HttpWebResponse)request.GetResponse();
MessageBox.Show(&quot;eingeloggt&quot;);
}
</pre>
<p>Jetzt brauchen wir nur noch unsere soeben erstellte Login Methode im Click-Event unseres rechten Buttons aufzurufen. (Denkt daran an Stelle von USER und PW euren Usernamen und euer Passwort einzusetzen!)</p>
<pre class="brush: csharp;">
private void buttonEinloggen_Click(object sender, EventArgs  e)
{
httpHelper.LogIn(&quot;email=USER&amp;password=PW&amp;login=Einloggen&amp;jsEnabled=true&amp;redirect=&amp;formkey=8d2668da70d06b913eb87e0d2515e5f41977ab
3d8ee403f6d21b532287d6a4a1aac8d251267dc338234239f3e77dc301d0f9924cf149f65c350e31f36001ba9b14bf2dc8764bf9d9fb70ac163ec5cdb7a8e501
fbb0fd3ca2c444fecf84f64448&amp;iv=07eec57af776415f6148b96383f3f9ae&quot;);
}
</pre>
<p>Das war’s auch schon! Wer m&#246;chte kann sich das Test-Projekt auch<strong><span style="font-size: 12pt"> <a href="http://net-blog.net/blog/downloads/LoginTutorial2.zip" target="_blank">hier downloaden</a></span></strong>. Wenn ihr euer Projekt nun startet, solltet ihr nach dem Login auch auf die gesch&#252;tzte Seite zugreifen k&#246;nnen.  Ich hoffe ihr konntet mir Folgen.<br />
<strong>Bei Fragen, Problemen, etc. schreibt mir einfach einen Kommentar.</strong></p>
<p>Liebe Gr&#252;&#223;e,<br />
<strong><em><span style="text-decoration: underline;">Raffi</span></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/09/30/c-login-auf-webseiten-per-httpwebrequest-und-httpwebresponse/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>IpCounter.de &#8211; C# API &#8211; Teil2</title>
		<link>http://www.net-blog.net/blog/index.php/2009/09/27/ipcounter-csharp-api/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/09/27/ipcounter-csharp-api/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 21:56:21 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#.Net]]></category>
		<category><![CDATA[IPcounter.de]]></category>
		<category><![CDATA[RegEx]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/?p=633</guid>
		<description><![CDATA[Schnell und einfach auf ipcounter.de Statistiken zugreifen
Vor einiger Zeit hatte ich schon mal einen Artikel verfasst, der sich damit besch&#228;ftige, wie man ohne gro&#223;en Aufwand, dank zwei kleiner Klassen, mit C# auf die Statistikdaten eines beliebigen Counter von www.ipcounter.de zugreifen kann. Da die Zeit ja bekannterma&#223;en niemals stehen bleibt, hat sich seitdem einiges getan. Ich [...]]]></description>
			<content:encoded><![CDATA[<h2>Schnell und einfach auf ipcounter.de Statistiken zugreifen</h2>
<p><a href="http://www.net-blog.net/blog/wp-content/uploads/IpCounter.deCAPITeil2_14B37/kchart128x128.png" rel="lightbox[633]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="k-chart-128x128" src="http://www.net-blog.net/blog/wp-content/uploads/IpCounter.deCAPITeil2_14B37/kchart128x128_thumb.png" border="0" alt="k-chart-128x128" width="164" height="191" align="left" /></a>Vor einiger Zeit hatte ich schon mal <a href="http://www.net-blog.net/blog/index.php/2009/03/19/c-ipcounterde-api/" target="_blank">einen Artikel verfasst</a>, der sich damit besch&#228;ftige, wie man ohne gro&#223;en Aufwand, dank zwei kleiner Klassen, mit C# auf die Statistikdaten eines beliebigen Counter von <a title="www.ipcounter.de - dein Counterservice!" href="http://www.ipcounter.de" target="_blank">www.ipcounter.de</a> zugreifen kann. Da die Zeit ja bekannterma&#223;en niemals stehen bleibt, hat sich seitdem einiges getan. Ich habe meine C# Kenntnisse ausgebaut und auch IpCounter hat sein Script nach und nach aktualisiert.</p>
<p>Die logische Schlussfolge daraus ist, dass die von mir damals verfassten Klassen nicht mehr funktionieren und sicherlich auch so eine General&#252;berholung gebrauchen k&#246;nnten. Aus diesem Anlass habe ich die beiden Klassen vollst&#228;ndig erneuert, dem aktuellen IpCounter Script angepasst und m&#246;chte euch die Arbeit nat&#252;rlich nicht vorenthalten.</p>
<p>An der Verwendung der Klassen hat sich nichts ge&#228;ndert, sprich die Methoden k&#246;nnen genauso wie bei der ersten Version aufgerufen werden. Im folgenden dennoch einmal eine kleine Hilfe zur Verwendung der Klassen und nat&#252;rlich am Ende des Posts den Download der Klassen f&#252;r Interessierte und Entwickler.</p>
<p><strong><span style="text-decoration: underline;">Verwendung der Klassen:</span></strong></p>
<p><span style="text-decoration: underline;">Schritt 1:</span> Klasse aufrufen und “Anzahl der Neuversuche” &#252;bergeben, die gestartet werden sollen, falls die Verbindung zu IpCounter.de nicht richtig hergestellt werden konnte.</p>
<pre class="brush: csharp;"> IpCounter ipc = new IpCounter(3); </pre>
<p><span style="text-decoration: underline;">Schritt 2:</span> Daten abrufen und weiterverwenden. (Beim Aufruf immer muss immer die ID, welche Ihr der Url eures Counters entnehmen k&#246;nnt, mitgegeben werden!)</p>
<pre class="brush: csharp;">

// Bef&#252;llt &amp;amp;amp; konfiguriert das &#252;bergebene DataGridView mit den Statistikdaten der letzten 30 Tage

ipc.Last30DaysGridView(dataGridView1, IPcounter_ID);

// Auf Wunsch k&#246;nnen die Statistiken der letzten 30 Tage auch als DataTable zur&#252;ckgegeben werden,

// welche sich wiederum z.B. an ein DataGridView binden l&#228;sst.

dataGridView1.DataSource = ipc.Last30DaysDataTable(IPcounter_ID);

// Gibt die Statistikdaten der letzten 30 Tage, als String Array zur&#252;ck

string[] LastDays = ipc.Last30Days(IPcounter_ID);

// Gibt die Anzahl der Online User als String zur&#252;ck

string OnlineUsers = ipc.OnlineUsers(IPcounter_ID);

// Gibt die Anzahl aller Seitenaufrufe (Hits) als String zur&#252;ck

string HitsGesamt = ipc.AllHits(IPcounter_ID);

// Gibt die Anzahl aller eindeutigen Besucher (Unique Visitors) als String zur&#252;ck

string UniqueVisits = ipc.AllUniqueVisitors(IPcounter_ID);

// Achtung! Die einzelnen Werte werden als Strings zur&#252;ckgegeben,

// da zur Trennung (Stichwort: Tausender-Trennung)

// von IpCounter aus Punkte verwendet werden.

// Wenn ein Integer Wert gew&#252;nscht wird, einfach folgendes verwenden:

int OnlineUsers = Convert.ToInt32(ipc.OnlineUsers(IPcounter_ID).Replace(&quot;.&quot;,&quot;&quot;));
</pre>
<p><span id="more-633"></span></p>
<p><strong><span style="text-decoration: underline;">Die Klassen (Download am Ende des Posts):</span></strong></p>
<p><em><strong>IPcounter.cs</strong></em></p>
<pre class="brush: csharp;">

class IpCounter

{

int ErrorTry;

int Trys = 0;

public IpCounter(int AnzahlVersuche)

{

this.ErrorTry = AnzahlVersuche;

}

private string GetHtml(string url)

{

try

{

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);

HttpWebResponse res = (HttpWebResponse)req.GetResponse();

StreamReader sr = new StreamReader(res.GetResponseStream());

string temphtml = sr.ReadToEnd();

sr.Close();

sr.Dispose();

res.Close();

return temphtml;

}

catch

{

Trys++;

if (Trys &lt; ErrorTry)

{

GetHtml(url);

return &quot;error&quot;;

}

else

{

Trys = 0;

return &quot;error&quot;;

}

}

}

public string OnlineUsers(int id)

{

RegExSolve Solver = new RegExSolve(GetHtml(&quot;http://ipcounter.de/stats/&quot; + id.ToString()));

return Solver.StatsOnline().Replace(&quot;&lt;strong&gt;&lt;span style=\&quot;font-size: 12px;\&quot; id=\&quot;stats_online\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;\r&quot;, &quot;&quot;);

}

public string AllHits(int id)

{

RegExSolve Solver = new RegExSolve(GetHtml(&quot;http://ipcounter.de/stats/&quot; + id.ToString()));

return Solver.StatsAll().Replace(&quot;&lt;strong&gt;&lt;span style=\&quot;font-size: 12px;\&quot; id=\&quot;stats_total_pi\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;\r&quot;, &quot;&quot;);

}

public string AllUniqueVisitors(int id)

{

RegExSolve Solver = new RegExSolve(GetHtml(&quot;http://ipcounter.de/stats/&quot; + id.ToString()));

return Solver.StatsUniqueAll().Replace(&quot;&lt;strong&gt;&lt;span style=\&quot;font-size: 12px;\&quot; id=\&quot;stats_total_visitors\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;\r&quot;, &quot;&quot;);

}

public string[] Last30Days(long id)

{

string[] error = new string[1];

error[0] = &quot;error&quot;;

RegExSolve Solver = new RegExSolve(GetHtml(&quot;http://ipcounter.de/stats/barchart/&quot; + id.ToString()));

string[] Days = Solver.Stats30Days();

if (Days.Length != 124)

{

Trys++;

if (Trys &lt; ErrorTry)

{

Last30Days(id);

return error;

}

else

{

Trys = 0;

return error;

}

}

else

{

Trys = 0;

return Days;

}

}

public DataTable Last30DaysDataTable(long id)

{

string html = string.Empty;

DataTable Stats = new DataTable(&quot;30TageRueckblick&quot;);

DataColumn[] ipcColumns = new DataColumn[4];

ipcColumns[0] = new DataColumn(&quot;Tag&quot;);

ipcColumns[1] = new DataColumn(&quot;Datum&quot;);

ipcColumns[2] = new DataColumn(&quot;UniqueVisits&quot;);

ipcColumns[3] = new DataColumn(&quot;Hits&quot;);

Stats.Columns.AddRange(ipcColumns);

try

{

html = GetHtml(&quot;http://ipcounter.de/stats/barchart/&quot; + id.ToString());

}

catch

{

Trys++;

if (Trys &lt; ErrorTry)

{

Last30Days(id);

Stats.Reset();

ipcColumns = new DataColumn[4];

ipcColumns[0] = new DataColumn(&quot;Wochentag&quot;);

ipcColumns[1] = new DataColumn(&quot;Datum&quot;);

ipcColumns[2] = new DataColumn(&quot;UniqueVisits&quot;);

ipcColumns[3] = new DataColumn(&quot;Hits&quot;);

Stats.Columns.AddRange(ipcColumns);

DataRow dr = Stats.NewRow();

dr[0] = &quot;Error&quot;;

dr[1] = &quot;Error&quot;;

dr[2] = &quot;Error&quot;;

dr[3] = &quot;Error&quot;;

return Stats;

}

else

{

Trys = 0;

Stats.Reset();

ipcColumns = new DataColumn[4];

ipcColumns[0] = new DataColumn(&quot;Wochentag&quot;);

ipcColumns[1] = new DataColumn(&quot;Datum&quot;);

ipcColumns[2] = new DataColumn(&quot;UniqueVisits&quot;);

ipcColumns[3] = new DataColumn(&quot;Hits&quot;);

Stats.Columns.AddRange(ipcColumns);

DataRow dr = Stats.NewRow();

dr[0] = &quot;Error&quot;;

dr[1] = &quot;Error&quot;;

dr[2] = &quot;Error&quot;;

dr[3] = &quot;Error&quot;;

return Stats;

}

}

RegExSolve Solver = new RegExSolve(html);

string[] Days = Solver.Stats30Days();

if (Days.Length != 124)

{

Trys++;

if (Trys &lt; ErrorTry)

{

Last30Days(id);

Stats.Reset();

ipcColumns = new DataColumn[4];

ipcColumns[0] = new DataColumn(&quot;Wochentag&quot;);

ipcColumns[1] = new DataColumn(&quot;Datum&quot;);

ipcColumns[2] = new DataColumn(&quot;UniqueVisits&quot;);

ipcColumns[3] = new DataColumn(&quot;Hits&quot;);

Stats.Columns.AddRange(ipcColumns);

DataRow dr = Stats.NewRow();

dr[0] = &quot;Error&quot;;

dr[1] = &quot;Error&quot;;

dr[2] = &quot;Error&quot;;

dr[3] = &quot;Error&quot;;

return Stats;

}

else

{

Trys = 0;

Stats.Reset();

ipcColumns = new DataColumn[4];

ipcColumns[0] = new DataColumn(&quot;Wochentag&quot;);

ipcColumns[1] = new DataColumn(&quot;Datum&quot;);

ipcColumns[2] = new DataColumn(&quot;UniqueVisits&quot;);

ipcColumns[3] = new DataColumn(&quot;Hits&quot;);

Stats.Columns.AddRange(ipcColumns);

DataRow dr = Stats.NewRow();

dr[0] = &quot;Error&quot;;

dr[1] = &quot;Error&quot;;

dr[2] = &quot;Error&quot;;

dr[3] = &quot;Error&quot;;

return Stats;

}

}

else

{

int count = 0;

while (count &lt; 124)

{

DataRow datrow =  Stats.NewRow();

datrow[0] = Days[count];

datrow[1] = Days[count + 1];

datrow[2] = Days[count + 2];

datrow[3] = Days[count + 3];

Stats.Rows.Add(datrow);

count = count + 4;

}

Trys = 0;

return Stats;

}

}

public void Last30DaysGridView(DataGridView datagridview_name, long IPcounterID)

{

string[] StatsTage = Last30Days(IPcounterID);

datagridview_name.Rows.Clear();

if (datagridview_name.ColumnCount != 4 || datagridview_name.Columns[0].HeaderText != &quot;Tag&quot; || datagridview_name.Columns[1].HeaderText != &quot;Datum&quot; || datagridview_name.Columns[2].HeaderText != &quot;Unique&quot; || datagridview_name.Columns[3].HeaderText != &quot;Hits&quot;)

{

datagridview_name.Columns.Clear();

datagridview_name.Columns.Add(&quot;Tage&quot;, &quot;Tag&quot;);

datagridview_name.Columns.Add(&quot;Datum&quot;, &quot;Datum&quot;);

datagridview_name.Columns.Add(&quot;Unique&quot;, &quot;Unique&quot;);

datagridview_name.Columns.Add(&quot;Hits&quot;, &quot;Hits&quot;);

}

datagridview_name.AllowUserToAddRows = false;

datagridview_name.AllowUserToDeleteRows = false;

datagridview_name.AllowUserToResizeColumns = false;

datagridview_name.AllowUserToResizeRows = false;

datagridview_name.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

datagridview_name.BorderStyle = BorderStyle.Fixed3D;

datagridview_name.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

datagridview_name.MultiSelect = false;

datagridview_name.ReadOnly = true;

datagridview_name.ScrollBars = ScrollBars.Vertical;

datagridview_name.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

datagridview_name.ShowCellToolTips = false;

datagridview_name.ShowEditingIcon = false;

if (StatsTage[0] != &quot;error&quot;)

{

int typec = 1;

int rowc = 0;

datagridview_name.Rows.Add();

foreach (string item in StatsTage)

{

if (typec == 5)

{

datagridview_name.Rows.Add();

typec = 1;

rowc++;

}

if (typec == 1)

datagridview_name.Rows[rowc].Cells[0].Value = item;

if (typec == 2)

datagridview_name.Rows[rowc].Cells[1].Value = item;

if (typec == 3)

datagridview_name.Rows[rowc].Cells[2].Value = item;

if (typec == 4)

datagridview_name.Rows[rowc].Cells[3].Value = item;

typec++;

}

}

else

{

datagridview_name.Columns.Clear();

datagridview_name.Columns.Add(&quot;Tage&quot;, &quot;Error&quot;);

datagridview_name.Columns.Add(&quot;Datum&quot;, &quot;Error&quot;);

datagridview_name.Columns.Add(&quot;Unique&quot;, &quot;Error&quot;);

datagridview_name.Columns.Add(&quot;Hits&quot;, &quot;Error&quot;);

}

}

}
</pre>
<p><em><strong>RegExSolve.cs</strong></em></p>
<pre class="brush: csharp;">

class RegExSolve

{

private string HTML;

public RegExSolve(string html)

{

this.HTML = html;

}

private string RegexResults(string ValueID)

{

Regex RegExPattern = new Regex(@&quot;((&lt;strong&gt;&lt;span style=&quot;&quot;font-size: 12px;&quot;&quot; id=&quot;&quot;&quot; + ValueID + @&quot;&quot;&quot;&gt;)+[0-9]+(.)*[0-9]*(.)*)&quot;);

return RegExPattern.Match(this.HTML).Value;

}

public string StatsOnline()

{

return RegexResults(&quot;stats_online&quot;);

}

public string StatsAll()

{

return RegexResults(&quot;stats_total_pi&quot;);

}

public string StatsUniqueAll()

{

return RegexResults(&quot;stats_total_visitors&quot;);

}

public string[] Stats30Days()

{

Regex RegExPattern = new Regex(@&quot;(((&lt;td class=&quot;&quot;col0&quot;&quot; style=&quot;&quot;text-align: left;&quot;&quot;&gt;)+((Montag,)|(Dienstag,)|(Mittwoch,)|(Donnerstag,)|(Freitag,)|(Samstag,)|(Sonntag,))+(&lt;/td&gt;)+)|((&lt;td class=&quot;&quot;col1&quot;&quot;&gt;)+[0-9.]+(&lt;/td&gt;)+)|((&lt;td class=&quot;&quot;col0&quot;&quot;&gt;)+[0-9.]+(&lt;/td&gt;)+)|((&lt;td class=&quot;&quot;col1&quot;&quot; style=&quot;&quot;font-weight: Bold;&quot;&quot;&gt;)+[0-9.]+(&lt;/td&gt;)+)|((&lt;td class=&quot;&quot;col0&quot;&quot; style=&quot;&quot;font-weight: Bold;&quot;&quot;&gt;)+[0-9.]+(&lt;/td&gt;)+))&quot;);

MatchCollection ResultCollection = RegExPattern.Matches(this.HTML);

string[] Results = new string[ResultCollection.Count];

for (int x = 0; x &lt; ResultCollection.Count; x++)

Results[x] = ResultCollection[x].ToString().Replace(&quot;&lt;td class=\&quot;col1\&quot; style=\&quot;font-weight: Bold;\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;td class=\&quot;col0\&quot; style=\&quot;font-weight: Bold;\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;/td&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;td class=\&quot;col0\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;td class=\&quot;col1\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;&lt;td class=\&quot;col0\&quot; style=\&quot;text-align: left;\&quot;&gt;&quot;, &quot;&quot;).Replace(&quot;,&quot;, &quot;&quot;); ;

return Results;

}

}
</pre>
<p><strong><span style="text-decoration: underline;">Download der Klassen:</span></strong></p>
<p><a title="Download IPcounter API" href="http://www.net-blog.net/blog/downloads/IpCounterApi2.zip" target="_blank">Download IPcounter API</a></p>
<p>Habt ihr Fragen, Probleme, Kritik, oder Anregungen? Dann schreibt mir doch einfach einen Kommentar! <img src='http://www.net-blog.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Liebe Gr&#252;&#223;e,</p>
<p>euer <strong><em><span style="text-decoration: underline;">Raffi</span></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/09/27/ipcounter-csharp-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webbrowser Control: DocumentText ohne Klickger&#228;usch &#228;ndern</title>
		<link>http://www.net-blog.net/blog/index.php/2009/08/09/webbrowser-control-documenttext-ohne-klickgerusch-ndern/</link>
		<comments>http://www.net-blog.net/blog/index.php/2009/08/09/webbrowser-control-documenttext-ohne-klickgerusch-ndern/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 10:08:00 +0000</pubDate>
		<dc:creator>Raffi</dc:creator>
				<category><![CDATA[C# & .net Framework]]></category>
		<category><![CDATA[Der tägliche Senf...]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Sounds]]></category>

		<guid isPermaLink="false">http://www.net-blog.net/blog/index.php/2009/08/09/webbrowser-control-documenttext-ohne-klickgerusch-ndern/</guid>
		<description><![CDATA[ Mal eben ein kurzer Einschub. Ich bastel zur Zeit mit dem Webbrowser Control in C# herum. Richtig nervig wird’s, wenn man jedes mal, wenn man den DocumentText &#228;ndert, dieses Klickger&#228;usch h&#246;rt. Doch wie kann man das Umgehen? Nachdem ich die Standardantworten, die man beim ersten Googeln findet, ausgeschlossen habe…
&#62;&#62; In der Systemsteuerung den Navigationssound [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.net-blog.net/blog/wp-content/uploads/WebbrowserControlDocumentTextohneKlickge_A6E8/internetexplorer128x128.png" rel="lightbox[602]"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="internet-explorer-128x128" src="http://www.net-blog.net/blog/wp-content/uploads/WebbrowserControlDocumentTextohneKlickge_A6E8/internetexplorer128x128_thumb.png" border="0" alt="internet-explorer-128x128" width="178" height="202" align="left" /></a> Mal eben ein kurzer Einschub. Ich bastel zur Zeit mit dem Webbrowser Control in C# herum. Richtig nervig wird’s, wenn man jedes mal, wenn man den DocumentText &#228;ndert, dieses Klickger&#228;usch h&#246;rt. Doch wie kann man das Umgehen? Nachdem ich die Standardantworten, die man beim ersten Googeln findet, ausgeschlossen habe…<br />
<strong>&gt;&gt;</strong> In der Systemsteuerung den Navigationssound ausstellen<br />
<strong> &gt;&gt;</strong> In der Registry die Sounds ausstellen</p>
<p>…wurde es etwas schwerer. Doch m&#246;chte ich ungerne, dass mein Programm sp&#228;ter systemweite Eingriffe vornimmt. An meinem PC mag das vielleicht noch akzeptabel sein, aber da gibt es sicherlich eine gro&#223;e Menge an Leuten, die dieses nicht gerade begr&#252;&#223;en w&#252;rden.<br />
Langer Rede kurze Sinn – die L&#246;sung ist einfach als ich dachte.</p>
<p>Statt</p>
<pre class="brush: csharp;">webBrowser.DocumentText = “MeinHTMLcode”;</pre>
<p>einfach</p>
<pre class="brush: csharp;">webBrowser.Document.OpenNew(true);
webBrowser.Document.Write(“MeinHTMLcode”); </pre>
<p>verwenden.</p>
<p>Das hat den gleichen Effekt &#8211; l&#228;uft aber ohne jegliche Klickger&#228;usche ab.</p>
<p>Liebe Gr&#252;&#223;e,<br />
<strong><em><span style="text-decoration: underline;">Raffi</span></em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.net-blog.net/blog/index.php/2009/08/09/webbrowser-control-documenttext-ohne-klickgerusch-ndern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
