Laden...
O
Benutzerbeschreibung
Gesperrter Benutzer (Werbung)

Forenbeiträge von Odin008 Ingesamt 58 Beiträge

29.06.2017 - 17:15 Uhr

Naja, diese Externes 8-fach Festplattengehäuse gedöns würde meine Raid Controller ersetzen und das möchte ich nicht...

und das mit den PC Gehäuse kommt für mich auch nicht in frage
da mein PC Gehäuse marke Eigenebau ist und nur 4 Interne Platten verbaut werden können und sind
diese sind auch einfach nur für die Personalisierten daten blabla 😄
Auserdem würde es schon optisch nicht passen..

Naja werd wohl nicht drum rum kommen es selbst zu basteln

29.06.2017 - 11:24 Uhr

Hallo,

ich würde gern wissen ob jemand weiß ob es ein Gehäuse für HDD Platten gibt
Bspw. Wie ein NAS-Server mit 8 Bays der also 8 Festplatten verschlucken kann. Ich suche ein solches Gehäuse für 16 Festplatten 2,5" oder 3,5" das is erstmal egal allerdings wirklich nur das Gehäuse
ich brauche da keine Technik drin... die Technik habe ich zu hause nur möchte ich ungern die Platten wahrlos rumliegen haben sondern sauber verstaut in einem gehäuse.

So in etwa stelle ich mir das vor allerings nur das Gehäuse das aufm Bild is nen NAS bzw. Raid Station
doch das brauche ich nicht.

Mfg Thomas =)

24.05.2017 - 05:43 Uhr

Das ist mir bewusst, jedoch brauche ich es.
Adfly schaltet ja Werbung und durch die Werbung macht der nutzer gewinn.
Da die Seite kein Adsense nutzen kann und sowieso keine Werbung direkt geschaltet wird aber die kosten gedeckt werden müssen nutzen sie Adfly und die User sind damit auch gut zufrieden da sie eben keine werbung auf der eigendlichen Seite haben sondern nur über den Adfly link und diesen können sie ja nach 5Sec. überspringen.

Und warum nicht direkt die Website genutzt wird zum kürzen der URLs ist ganz einfach
derzeit stehen 14,356 URLs an die gekürzt werden müssen und täglich kommen zwischen
30 - 100 URLs dazu.

Auserdem geht es nicht darum das der User nicht sehen darf worauf die URL verweist sondern viel mehr um die Werbe einnahmen. Die User sind informiert das der Adfly Link auf eine andere Seite verweist. Auserdem ist es immer die selbe Seite auf die verwiesen wird nur eben ändert sich das verzeichnis.

24.05.2017 - 05:07 Uhr

Morgen,

ich möchte mittels C# URLs durch AdFly kürzen.
Ich habe keine ahnung wie der haken ist oder was falsch ist...
Evtl. kann mir hier jemand helfen.





string adFlyUserId = "UserID";
            string adFlyPublicKey = "PublicKEY";
            string adFlySecretKey = "PrivateKEY";

            int unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
            string monthName = DateTime.Now.ToString("MMMM", new System.Globalization.CultureInfo("en-US"));
            string adFlyBaseUrl = "http://api.adf.ly/v1/";
            string adFlyQueryString = string.Format(@"_user_id={0}&_api_key={1}&_timestamp={2}&date={3}", adFlyUserId, adFlyPublicKey, unixTimestamp, monthName);
            string adFlyHash = string.Empty;
            byte[] keyByte = Encoding.GetEncoding(28591).GetBytes(adFlySecretKey);
            byte[] messageBytes = Encoding.GetEncoding(28591).GetBytes(adFlyQueryString);
            using (var hmacsha256 = new HMACSHA256(keyByte)) {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                adFlyHash = ByteToString(hashmessage);
            }
            string adFlyEndPoint = adFlyBaseUrl + "publisherStats?" + adFlyQueryString + "&_hash=" + adFlyHash;

            WebRequest request = WebRequest.Create(adFlyEndPoint);
            WebResponse response = request.GetResponse();
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.Write(responseFromServer);
            Console.ReadKey();
        }

        private static string ByteToString(byte[] buff) {
            string sbinary = "";
            for (int i = 0; i < buff.Length; i++)
                sbinary += buff[i].ToString("X2");

            return (sbinary);
        }

Als rückmeldung erhalte ich

Fehlermeldung:
{"errors":[{"code":7,"msg":"Authentication failed. Hashes do not match."}],"warnings":[],"data":null,"page":{"current":1,"total":1}}

#Edit:

Problem gelöst.
Parameter in der Doc sind ein wenig irreführend.
Ebenso passte die HMACSHA256 nicht

27.11.2015 - 03:19 Uhr

"den grundlegenden Aufbau zu verstehen"

Bedeutet das jetzt für Dich das ich also einen kompletten Compiler/Interpreten erstellen möchte?
Ich mein für mich klingt das so als möchte ich nur gerne wissen wie so etwas aufgebaut ist und funktioniert es interessiert mich halt da investiere ich auch gerne meine Freizeit und lese und experimentiere bis ich dann mal sagen kann "Okay, jetzt versteh ich was da passiert/passiert ist"

Ich habe ja auch schon erwähnt das dies NUR für mich ist, d.h ich möchte gerne FÜR MICH verstehen wie so etwas funktioniert. Im Endeffekt werde ich der Benutzerfreundlichkeit wegen auf eine fertige Alternative zurückgreifen

Ja das ist ja das schöne das ich damit soviel Zeit verplempern kann wie ich möchte da ich es in meiner Freizeit mache. Das bedeutet es stört keinen, tut keinen weh, mir machts spaß und es interessiert mich halt =) Ich mein ich arbeite nicht umsonst 8 - 10h am Tag da kann ich mich am Abend auch mal hinsetzen (Es ist für mich auch beruhigend andere lesen ein Buch, ich Programmier ein bissl rum) und etwas machen was mir extrem viel Spaß macht und großes Interesse dafür besteht - das ist nunmal das Programmieren und das Kochen!

#Kaffeepause 👍

26.11.2015 - 15:48 Uhr

Danke auch dir für diesen Link =)

Jedoch "Möchte" ich das Rad nicht zwingend neu erfinden das war ein Beispiel klar ich greifen auch auf fertigen Sachen zurück jedoch erst wenn ich diese komplett verstanden habe und deren verhalten nachvollziehen kann, anders wäre es für mich Quatsch eine solche Klasse zu verwenden ohne zu wissen was sie tut oder kann.

Nochmal zu der Scriptsprache ich möchte es gerne selbst schreiben doch nur ein paar kleine Teile um den grundlegenden Aufbau zu verstehen dabei greife ich auch gerne auf vorhandene Klassen zurück und studiere deren verhalten und versuche dann anhand dieser es nachzubilden

Solange bis ich 1:1 nachvollziehen kann was in der Klasse passiert

26.11.2015 - 15:09 Uhr

Danke für die ganzen Antworten =) Freut mich sehr, soviel Input _

Ja gfoidl, ja das wäre im Endeffekt auch der fall jedoch möchte ich bevor ich ein Script/Engine von einem fertigen oder einer anderen Quelle verwende möchte ich mich jedoch erstmal in die Materie einlesen um zuverstehen was genau passiert. D.h ich möchte vorab versuchen selbst eine solche Scriptsprache zuerstellen aber im späteren verlauf auf eine bestehende zurück greifen um es Nutzerfreundlicher zu gestalten da mittlerweile Scriptsprachen für solchen Plugins/Mods immer beliebter und bekannter werden sollte es im endeffekt kein großes Problem sein sich mit einer solchen Sprache anzufreunden bzw. kennen die meisen den Syntax schon und müssen sich nur mit den neuen Funktionen und Methoden vertraut machen können aber schliesslich auf das vorhandene Wissen durch sagen wir Spiele, Z.B Multi Theft Auto (Verwendet LUA für die Programmierung der Server/Client Scripte) zurückgreifen

Vielleicht bin ich auch einfach zu naiv aber ich weigere mich fast immer vorhandene Klassen zu verwenden bevor ich nicht weiß wie sie Aufgebaut sind wie sie Funktionieren.. Vielleicht könnte ich ja eine solche Klasse selbst schreiben und könnte Funktionen ergänzen oder erweitern. Dies ging mit einer Compilierten Klasse ja nicht. Desswegen bin ich realtiv dagegen solche zu verwenden.
Natürlich ist mir auch klar das ich nicht das Rad neu erfinden muss. Jedoch blicke ich gerne auf meine Arbeiten zurück und kann Stolz sein es allein geschafft zu haben. Huch ich schweife ab 😄

Ich bedanke mich nochmal ich werde mich jetzt erstmal durch alles durchlesen =)

26.11.2015 - 13:45 Uhr

Das ist mir durchaus bewusst das es nicht mal so ebend schnell mit ein paar Zeilen Code gemacht ist jedoch würde ich das gerne mal sehen bzw. verstehen wie soetwas funktioniert wie eine Datei geladen wird und deren Inhalt ausführbar wird.
Ebend wie LUA Scripte oder Php Scripte diese sind zwar schon realtiv gewaltig jedoch
möchte ich für meinen Zweck einfach nur das z.B 3-4 Commands ausführen kann
um es einfach zu verstehen mich interessiert dieses Thema

Mein Script Beispiel war ebend nur ein Beispiel ich würde mich natürlich auch mit etwas einfacheres zufriedengeben z.B das ich nur den Command verwende
also Message.Show("Hello World");
einfach das diese Zeile ausfürbar wird im eigentlichen Programm

TypeScript werde ich mir natürlich auch gerne ansehen 😉

26.11.2015 - 13:29 Uhr

Hallo,

mich würde mal interessieren wie man eine Solche Scriptsprache wie z.B LUA erstellen kann.
Beispiel:

Wir haben ein Programm geschrieben welches ein Overlay in Spielen und anderen Fullscreen Anwendungen läuft. Nun möchte man mittels Scriptsprache das Overlay anpassen. Z.B
eine FPS anzeige.

Also wie funktioniert das, wie schreibe ich eine solche Scriptsprache welche korrekt ausgelesen und ausgeführt wird. Ich möchte z.B erstmal wissen wie der generelle aufbau einer solche Sprache ist und wie man diesen Code währendessen ausführt. Z.b möchte ich beim Programm start ebend das er die Plugins ausliest und einbindet
und neue Funktionen hinzufügt z.B bei F3 soll dann ein Hello World erscheinen
Die Scripte sollten dann jedoch relativ einfach gehalten werden in etwa so

Function onKeyDown(key){
if (key == Keys.F3)
Message.Show("Hello World");

}
17.10.2015 - 11:52 Uhr

So ich bin jetzt aufjedenfall etwas schlauer 😉
Ich kam zwar noch nicht zu einigen Tests aber das werde ich jetzt nach holen.
Aufjedenfall waren die Beispiele sehr Hilfreich...Einfach ein sehr großes Thema und sehr sehr viele Interssante Punkte ... Hihi ich Freu mich 😉

15.10.2015 - 14:41 Uhr

Okay danke schonmal für die ganzen Antworte ich werde sie mir nach und nach ansehen

Load Balancer kannt ich noch nicht klingt aber sehr interessant zumindest das was ich darüber auf die schnelle gelesen haben und es beschreibt mein vorhaben doch ziemlich genau..

Also danke schonmal für die ganzen Antworten 😉

15.10.2015 - 14:08 Uhr

Hey,

Ich hab da mal eine Frage.

Es ist alles nur Beispielhaft um es Euch besser zuerklären.

Angenommen wir erstellen ein Server-Client Project wie Skype
wie würdet Ihr die massenhaften Clients verwalten?
Wäre es sinnvoll mit mehreren Server und einen Master Server zu arbeiten?

z.B Master Server ist immer erreichbar die anderen Server können bzw. dürfen ausfallen
also Client A Verbindet sich mit dem Master-Server und teilt ihm mit was er möchte z.B sich Anmelden. Der Master-Server wickelt die Anmeldung ab und sucht dann für den Client einen freien Server. Server 7 wurde gefunden und kann noch Clients aufnehmen. Der Master Server teilt den Client nun mit das Server 7 informiert wurde und auf eine Verbindung wartet (Übertragen wird dann ein Token damit der Server weiß das es der richtige Client ist) sollte der Client sich mit dem Server 7 verbunden haben und die Verbindung wurde erfolgreich aufgebaut meldet Server 7 den Master Server ALLES OK und der Master Server würde das vermerken. Sollte sich nun Client B verbinden und auch anmelden würde der Master Server wieder nach einen freien Server suchen und bemerken okay Server 7 ist voll nimm Server 12 und dann ebend das gleiche Spiel.
Nun möchte Client A eine Nachricht an Client B Senden da sie beide im Netzwerk verbunden sind aber nicht mit dem selben Server. Das würde bedeuten Client A Sendet "Hallo" und der Server 7 wurde schauen ob der Client bei ihm verbunden ist wenn nicht sendet er die Nachricht an den Master Server mit Client ID etc... dieser leitet dann die Nachricht an den richtigen Server weiter und dieser dann an den Client.

Das Problem dabei wäre sicherlich die verlängerten Wartezeiten zwischen den Nachrichten da es ja auf umwegen passiert und nicht direkt zwischen den beiden Clients somit wären Clients des selben Servers aufjedenfall schneller.
Problematisch würde dann Voice Chat werden da, da die verzögerungen auffallen würden aber da könnte man dann ja z.B eine Direkt Verbindung aufbauen z.B P-t-P

Naja sagt mir Eure Meinungen dazu und Eure Ideen.

Mfg Thomas

04.09.2015 - 23:06 Uhr

Nabend,

Ich habe ein Problem mit der Kollisions Abfrage.
Bisher läuft alles soweit nur Die Kollisions Rechtecke werden anders gezeichnet als wie gewünscht.

Siehe Bild
(Die Erklärung im Bild sollte ausreichend sein. Fals nicht einfach melden)

Code:


            static List<wall> walls = new List<wall>();
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(0, 0)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(0, 32)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(0, 64)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(0, 96)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(32, 32)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(64, 64)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(96, 96)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(128, 0)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(160, 0)));
            walls.Add(new wall(Content.Load<Texture2D>("tileset_1"), new Vector2(192, 0)));

        public static bool ColWall(Vector2 posi) {
            foreach (wall wall in walls) {
                Rectangle rect1 = new Rectangle((int)wall.posi.X, (int)wall.posi.Y, 32, 32);
                Rectangle rect2 = new Rectangle((int)posi.X, (int)posi.Y, 32, 32);
                return rect1.Intersects(rect2);
            }
            return false;

        }
//aufgerufen wird das ganze dann so
if (Keyboard.GetState().IsKeyDown(Keys.Down) && !Game1.ColWall(new Vector2(0, this.Y + 1 * speed))) {
                    CharacterEntity.currentAnimation = CharacterEntity.walkDown;
                    posi.Y += 1 * speed;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.Up) && !Game1.ColWall(new Vector2(0, this.Y - 1 * speed))) {
                    CharacterEntity.currentAnimation = CharacterEntity.walkUp;
                    posi.Y -= 1 * speed;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.Left) && !Game1.ColWall(new Vector2(this.X - 1 * speed, 0))) {
                    CharacterEntity.currentAnimation = CharacterEntity.walkLeft;
                    posi.X -= 1 * speed;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.Right) && !Game1.ColWall(new Vector2(this.X + 1 * speed, 0))) {
                    CharacterEntity.currentAnimation = CharacterEntity.walkRight;
                    posi.X += 1 * speed;
                }

#Edit: Problem Evt. gefunden die Forech schleife behandelt dauerhaft nur das erste Element was der liste Walls eingefügt wurde die anderen nicht. Zumindest ändern sich die Koordinaten der Wände nicht. Doch bei der gleich aufgebauten Forech schleife zum Zeichnen der Blöcke/Wände gehts da durchläuft er jedes Object... Ich verstehts nicht... Man man man bist du doof... beim return wird aus der schleife herraus gesprungen...

#Edit2: Problem gelöst 😄 Habe einfach jeden Element seine eigene Hitbox verpasst mit jeweils 4 Seiten
Mfg

22.04.2015 - 15:18 Uhr

Ja das meine ich ja nur muss der Benutzer den schüssel ja nicht kennen reicht ja wenn das Programm den Schlüssel kennt und die ankommenden nachrichten sofort entschlüsseln kann.

Noch ne Frage zur Datenbank

Ich verwende derzeit MySQL gibt es zwischen MySQL und SqlLite große unterschiede?
Ich mein mein Projekt kann ich ganz easy auf SQLLite umbauen das ist nicht so das Problem
Nur wüsste ich gerne welche vorteile oder nachteile das bringt.

22.04.2015 - 14:44 Uhr

Ja das sowieso aber soweit sind wir ja noch nicht 😉

Jaa mir geht es ja nicht darum das ich es immer lesen kann sondern eher das wenn z.B mal lustig ausgedrückt "Ein Nachtwächter zugang zur Datenbank erhällt (aus welchen grund auch immer) das er,er der keine ahnung davon hat diese Nachrichten nicht in Klartext lesen könnte.

Ja ich denke ich werde mir mal das mit dem Clientspezifischen Schüssel ansehen und etwas rum experimentieren. Naja was heißt bekannt sein? Der Client muss ja nur den Schüssel haben d.h ich könnte ihn ja auch in der Regestrierung ablegen und somit hat der User nichtmal ne Ahnung das ein solcher schlüssel Existiert. Ahh es gibt soviele möglichkeiten soviele Ideen...einfach Unfassbar...aber es macht Spaß 😄

22.04.2015 - 14:28 Uhr

Wow.. ich bin völlig überrascht wieviele sich gleich mit eingeklinkt haben 😉

Erstmal danke für die ganzen Antworten.

@Mallett
Nein das ist kein Problem denn jeder Client hat eine eindeutige ID z.B wie jeder Computer seinen Computernamen hat mit dieser ID verbindet er sich zum Server d.h
Client sendet -> Username,Passwort(Verschlüsselt) & ID -> Server
Der Server speichert dann ID und Usernamen (Somit ist der Client immer eindeutig)

Würde ich also die Nachrichten in eine Datenbank oder einer Datei speichern würde ich die Nachrichten sowie die Client ID speichern somit wüsste der Server das die nachrichten nur für den Client mit der ID sind.

@Alle anderen
Natürlich verwende ich TCP für den Chat
Vielleicht kommen später ja noch Dateiübertragungen oder Voice/Videochats dafür würde ich UDP verwenden

Ich verwende ja sowieso schon eine Datenbank um überhaupt die Clients zu indentifizieren
Also Client wird beim User gestartet der User muss sich erstmal anmelden um zugriff auf die Funktionen des Chats zu erhalten also werden Username,ID,Passwort,IP und Datum in der Datenbank eingetragen logt sich der Client nun ein prüft der Server ob der User in der Datenbank existiert wenn Ja lässt er die Verbindung zu wenn nicht ebend nicht

Nun wie verhält sich das aber mit dem Datenschutz denn speicher ich die letzten Nachrichten in einer Datenbank ist es ja für Mich oder einen Mitarbeiter mit datenbank zugriff leicht die gesendeten Nachrichten einzusehen da hatte ich mir dann überlegt ok was wäre wenn ich die Nachrichten zwar auf dem Server speichere diese aber nicht als String sondern als Bytes speichere somit ist es für einen Anfänger ja nicht mehr so leicht die Nachrichten zulesen und sobalt der Client die nachricht erhalten hat diese wieder aus der Datenbank löschen

22.04.2015 - 02:51 Uhr

Nabend,

Ich sitze derzeit immernoch voller begeisterung an meinem Chat Server/Client Pojekt.
Nun habe ich mal eine Frage.

Beispiel:

2 Clients verbinden sich zum Server.
Client A sendet eine Nachricht an Client B diese beiden Chatten ein wenig, dann verliert Client A
die Verbindung zum Server. Client B sendet allerdings noch eine Nachricht für Client A.
Diese kann ja logischerweiße nicht mehr zugestellt werden, da Client A ja nicht mehr mit dem Server verbunden ist.

Wie kann ich das nun ambesten handhaben damit die gesendeten Nachrichten Client A erreichen sobalt dieser sich wieder mit dem Server verbindet

Es gibt natürlich nun mehrere Möglichkeiten
z.B könnte ich sobalt der Server erkennt das Client A die verbindung verloren hat die Nachrichten in einer Datenbank speichern und beim erneuten verbinden die Nachrichten mit den Client abrufen

Oder die Nachrichten auf dem Server speichern z.B eine Text-Datei. Sobalt sich Client A wieder verbunden hat die Nachrichten auslesen und an den Client senden.

Wie würdet Ihr das ganze handhaben?

25.03.2015 - 18:19 Uhr

Ahh ok Danke werd ich mir mal anschauen.

25.03.2015 - 16:55 Uhr

Ich möchte mich bei Euch entschuldigen für mein etwas aggresive wortwahl des letzten Posts war einfach bissl gestresst

Ja ich hatte das vieleicht auch nicht ganz verständlich erklärt
Ich weiß jetzt aufjedenfall wie ich nun vorgehen muss

Ich möchte mich bei allen bedanken die mitgeholfen haben 😃

Ich weiß zwar grad den Namen nicht doch jemand sagte die Idee alles auf einmal zu lesen wäre keine Gute Idee..Hab ich gemerkt 😄 mache es nun mit einer Schleife und führen die gelesenen datensätze später zusammen

Die Anmeldung beim Server läuft nun auch problemlos

Ich habe aber gemerkt wenn ich die Clients die verbunden sind in einer Hashtabelle oder eine List<> speichere und später versuche diesen Client (vom server aus) zu einen Disconnect zu zwingen interessiert es den Client nicht d.h der Client "denkt" noch immer das er verbunden sei

also ich trenne die Verbindung des Clients vom Server aus.
Versuche dann beim Client zu prüfen ob er noch mit dem Server verbunden ist z.B mit

TcpClient client  = new TcpClient(); // Ist nur das Beispiel damit ihr wisst was Client ist
client.close();
oder mit client.client.disconnet();

Trenne ich die verbindung vom Server aus doch prüfe ich danach am Client

If (client.connected == true) { Console.WriteLine("Client ist noch Verbunden."); }

Wenn ich den Server debugge und mir die Informationen des Clients ansehe ist connected = false und z.B

 Client.available() 

würde eine Exception werfen da er ja nicht mehr verbunden ist

Theoretisch müsste ich am Client somit ja auch nicht mehr in den Stream schreiben können also eine Exception geworfen werden doch das wird es nicht jedoch kommen die nachrichten die im Stream geschrieben wurden auch am Server nicht mehr an
Also ist er ja nicht mehr verbunden daraum verstehe ich nicht warum client.connected True ausgibt beim Client

24.03.2015 - 16:43 Uhr

ok lassen wir das ihr habt anscheinend alle mein Problem nicht verstanden...
Rioma
Dein Beispiel ist genau das was ich ebend auch nicht meinte bei dem Beispiel liest er immer 256 Bytes aus dem Stream egal ob diese leer sind oder nicht desswegen will ich ja fixe Zahlen vermeiden damit er erst garnicht leere bytes auslesen kann desswegen hatte ich eher an eine lösung gedacht das ich vom Client irgendwie die länge der Daten an den Server übersenden kann und dieser dann auch nur ganz genau diese ausliest aus dem stream

Ja ich weiß das ich die leeren Bytes auch rausfiltern kann und das problem ja somit eigendlich gelöst wäre doch der interesse wegen hab ich mich halt dafür interessiert

Naja dennoch danke für diese Gespräche...

24.03.2015 - 16:24 Uhr

Ja ich habe es auch schon so versucht wie in z.B diesen Beispiel eines Chat Servers/Clients[

How to C# Chat Client ](http://csharp.net-informations.com/communications/csharp-chat-client.htm)

Das Problem dabei nur ist

byte[] outStream = Encoding.ASCII.GetByte("Blablabla" + "$");
stream.Write(outStream, 0, outStream.Length);

Läuft keine Probleme

Beim Server jedoch mit

byte[] byteFrom = new byte[10025];
stream.read(byteFrom, 0, (int)client.ReceiveBufferSize);
dataFromClient = Encoding.ASCII.GetString(bytesAuth);
msg(dataFromClient.Substring(0, dataFromClient.IndexOf('$')));

Wirft er ne Exception da byteFrom nicht so groß ist wie der ReciveBuffer.

24.03.2015 - 16:00 Uhr

Genau das will ich ja nicht ich will mich nicht auf eine Anzahl festlegen denn ist meine Anzahl zu größ gibt er mir leere Bytes aus ist sie zu klein wirft er ne Exception oder ebend beim Buffer das er mir die Ausgabe in entwa so schreibt:
Co

na

_

Do

yl

24.03.2015 - 15:24 Uhr

Was meinst du mit ein eigenes Protokoll schreiben ?

Wenn ich das richtig verstanden habe soll ich also die Bytezahl als erstes in dem Stream schreiben und dann die Daten. Beim Server dann den Stream lesen und die Bytezahl festlegen
Doch demnach käme ich wieder auf das Problem das ich dem Stream nicht sagen kann wie Groß die Bytezahl ist ich mein wenn ich ein kleines Paket verschicke ist z.B die Bytezahl = 10 versende ich ein Großes aus einer Datenbank wäre die Bytzahl = 100
Das würde mein Problem so ja nicht lösen

24.03.2015 - 15:09 Uhr

Moin,

Ich beschäftige mich momentan mit Client und Server verbindungen.
Die Idee:
Ich möchte das der Client sich am Server erstmal "vorstellen" tut
also hab ich gedacht ich bastle mir mal etwas zurecht.
Klappt auch alles soweit Daten werden vom Client gesendet und am Server empfangen.
Das Problem ist ich kann ja nie wissen wie lang z.B eine E-Mail oder ein Username ist somit kann ich den Server nicht sagen wieviele Bytes er auslesen soll. Dann kam mir die Idee "receivebuffer" beim Client fest zulegen mit der genauen länge des Strings der gesendet wird
im Server kommt dann aber nicht z.B 10Bytes raus sondern 65536 bytes d.h er liest mir 65536 Bytes aus dem Stream wovon aber nur 10 Bytes beschrieben sind die anderen sind leer.

Nun wie kann ich vom Client ausgehen senden wie viele Bytes es sind damit der Server auch die genaue Anzahl ausliest?

Hier der momentane Test Code wirrwarr
Client:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

//////////////////////////////////////////
//                CLIENT               //
/////////////////////////////////////////

namespace Client {
    class Program {
       static TcpClient clientSocket = new TcpClient();
       static NetworkStream serverStream = default(NetworkStream);
       static string readData = null;

        static void Main(string[] args) {
            Console.WriteLine("Client started.");
            Console.WriteLine("Client connecting to 127.0.0.1:2525");

            byte[] byteToServerAuth = Encoding.ASCII.GetBytes("Conan_Doyl");
            clientSocket.ReceiveBufferSize = byteToServerAuth.Length;
            clientSocket.Connect("127.0.0.1", 2525);
            serverStream = clientSocket.GetStream();

            serverStream.Write(byteToServerAuth, 0, byteToServerAuth.Length);
            serverStream.Flush();

            
            Console.ReadKey();
        }
    }
}

Server:


        public static void WaitForConnections() {
            TcpListener serverSocket = new TcpListener(IPAddress.Any, 2525);
           // List<Tuple<TcpClient, string, string>> clients = new List<Tuple<TcpClient, string, string>>();
            //clients.Add(new Tuple<TcpClient, string, string>(clientSocket, "", ""));
            TcpClient clientSocket = default(TcpClient);
            string dataFromClient = null;
            serverSocket.Start();
            while (true) {
                clientSocket = serverSocket.AcceptTcpClient();

                NetworkStream stream = clientSocket.GetStream();
                byte[] bytesAuth = new byte[10]; // Hier müsste ich die genau Bytezahl wissen die gesendet wurde.
                do {
                    stream.Read(bytesAuth, 0, clientSocket.ReceiveBufferSize); //  Hier müsste ich die genau Bytezahl wissen die gesendet wurde.
                    dataFromClient = Encoding.ASCII.GetString(bytesAuth);
                    msg(dataFromClient);
                } while (stream.DataAvailable);
                
                
            }
        }

21.02.2015 - 15:30 Uhr

Ja habs jetzt verstanden war ein Denkfehler von mir
Natürlich ist mir klar das ich keine Adressen erhalte wenn die Exception geworfen wird
der fehler war also nur in meinem Kopf

Was ich mit Exception mit return weitergeben meinte war
z.B


public string Test(){
       try{
          BlaBla...
       }
       catch(Exception ex){ return ex.Message; }

}

public void Test2(){
         string bla = Test();
}

21.02.2015 - 10:35 Uhr

Ahh genau das war's 😄
Ich wusste doch das ich das schomal irgendwo hatte jetzt weiß ichs auch wieder

Ja stimmt ich denke auch ich werde das Try-Catch weglassen

Danke für den Denk anstoss

21.02.2015 - 08:13 Uhr

Die MessageBox war allein für mich da er mir ja mal eine Exception geworfen hatte und ich dieses ebend wissen wollte

Der Aufruf der Funktion findet im Hauptprogramm aber im eigenen Thread statt
Ja wenn ich die Exception aber bis zum Hauptprogramm durchlaufen lassen mit return z.B
fehlt mir der return der Adressen die ich im Hauptprogramm ebendfals benötige

21.02.2015 - 06:20 Uhr

Scheint für mich ein Problem mit der Übergabe des Links zu sein

Wenn dieser in der E-Mail nicht korrekt ist bzw. nicht anklickbar ist.
Versendest du den Link in der E-Mail mit den <a href="LINK" /> Tag?
Evt. ist HTML nicht erlaubt bzw. deaktiviert.

Zur not würde ich einfach das Programm weglassen denn mit Php selbst ist selbiges ja auch zu erstellen. Natürlich auch für Smartphones.
Sofern das Programm nicht noch weitere Funktionen hat denn wenn es nur die Website aufrufen soll eine suchen starten auf der Website und die ergebnisse per Mail senden kannst du es ja auch einfach komplett in Php erledigen.

21.02.2015 - 04:49 Uhr

Morgen,

Ich habe ein Problem, ich weiß derzeit nicht wie ich einen String der in der DLL erstellt wurde, an die Form1 senden kann um ihn dort anzeigen zu lassen.

Also ich habe eine Form logFrm
in dieser befindet sich eine RichTextBox, in der ich gerne die Exception der DLL anzeigen lassen möchte.


static ArrayList adress = new ArrayList();
       public static ArrayList GetEmailsFromDB(MySqlConnection client) // Get all Email Adresses from the DB
       {
           MySqlCommand cmd = client.CreateCommand();
           cmd.CommandText = "SELECT * FROM users ORDER BY user_id";
           

           
           MySqlDataReader reader;
           reader = cmd.ExecuteReader();
           try
           {
                   while (reader.Read())
                   {
                       if (reader["user_email"] != "")
                       {
                           adress.Add(reader["username"] + "|" + reader["user_email"]);
                           //MessageBox.Show(reader["username"].ToString());
                       }
                   }
               reader.Close();
               return adress;
           }
           catch (Exception ex) 
           {
               MessageBox.Show("Error: " + ex.Message); // Das soll z.B zu logFrm.LogText("Error: " + ex.Message, 3); Der Zweite Parameter wäre die Farbe in der, der log ausgegeben wird. Diese Funktion nutze ich auch schon um die Logs zwischen den Forms zu teilen mit Invoke und Delegate um die RichTextBox ansprechen zu können. da ich aber in der DLL das WindowsForms Poject nicht als verweiß einbinden kann klappt das nicht. 
               return null;
           } 
       }

Bitte habt nachsicht bin leider keiner von den die mit 3 Jahren schon perfect Programmieren können 😉

MFG

14.11.2014 - 11:36 Uhr

Hallo,

Was für ein Stream ist das ? z.B von Twitch.TV kann man den Online Status ganz leicht abfragen dazu habe ich auch schon ein tool geschrieben.

Vieleicht hilft dir ja der link http://naudio.codeplex.com

Theoretisch sollte man doch auch das Audio Signal abfangen können und prüfen können ob Sound abgespielt wird oder nicht...Würde mich auch Interessieren.
Hab mich selbst noch nicht so damit befasst werde mal schauen was sich machen lässt und was dazu im Internet zufinden ist. Wenn ich etwas finde werde ich mich hier nochmal melden.

Mfg Odin 😉

10.09.2014 - 21:10 Uhr

Ohh okay und wie entferne ich dann die Clients die nicht mehr verbunden sind?

10.09.2014 - 21:03 Uhr

Danke Euch habs problem soweit gelöst nur hab ein weiteres Problem
undzwar ich verbinde mich empfange die Daten und schliessen dann den Client
alles kein Problem
dann versuche ich mich nochmal mit dem Client zu verbinden und der Server schmiert ab mit

Fehlermeldung:
"An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll

Additional information: Collection was modified; enumeration operation may not execute."

In folgender Zeile:


            [COLOR]foreach (var connections in Connection)
[/color]
            {
                try
                {
                    connections.sWriter.WriteLine(MCOutput);
                    connections.sWriter.Flush();
                }
                catch
                {
                    Connection.Remove(connections);
                    Console.WriteLine("Client remove");
                }
            }

Der Rot makierte Satz löst den fehler aus

Im Server kommt erst die Meldung das der neue Client sich verbunden hat
und danach das der alte Client gelöscht wurde

Wie kann ich jetzt verhindern das der Server desswegen abschmiert?

10.09.2014 - 17:24 Uhr

Entweder bin ich zu doof dafür oder es bringt nichts denn ich erhalte immernoch keine Informationen am Client....

10.09.2014 - 14:57 Uhr

Moin,

Ich habe ein Problem was ich nicht so ganz verstehe
Es sieht folgendermaßen aus:

Server -> startet
Server -> startet ein Minecraft Server und fängt den output ab
Server -> sendet den abgefangenen output zu allen verbundenen Clients

Client -> Verbindet sich zum Server
Server -> Meldet Client Connected
Client -> Soll solange daten gesendet werden diese auslesen und anzeigen so das ich eine Kopie der Server Konsole habe. Klappt aber nicht ganz entweder kann ich nur 1x auslesen oder garnicht.

Server:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Diagnostics;
namespace MinecraftServerManager.TCPIP
{
    /*************************************************
     *************************************************
     ***************Coded by 3r0rXx********************
     *************************************************
     *************************************************
     */
    public class Server : IServer
    {
        public IPAddress Ip { get; private set; }
        public int Port { get; private set; }
        public int Xmx { get; private set; }
        public int Xms { get; private set; }
        public string ServerPath { get; set; }
        public string MCOutput { get; private set; }
        public List<Client> Connection = new List<Client>();

        private TcpListener tcpServer;
        public NetworkStream tcpStream;

        public void Init(string _ip, int _port, int _Xmx = 2048, int _Xms = 512, string _serverPath = "craftbukkit-1.5.2-R1.0.jar")
        {
            if (_ip == "")
            {
                Ip = IPAddress.Any;
            }
            else
            {
                Ip = IPAddress.Parse(_ip);
            }
            Port = _port;
            tcpServer = new TcpListener(Ip, Port);
            Xmx = _Xmx;
            Xms = _Xms;
            ServerPath = _serverPath;

            #region startMc
            Process Server = new Process();
            ProcessStartInfo ServerStartInfo = new ProcessStartInfo(@"C:\Program Files\Java\jre1.8.0_20\bin\java.exe");
            ServerStartInfo.Arguments = "-Xmx" + Xmx + "M -Xms" + Xms + "M -jar " + ServerPath;
            ServerStartInfo.CreateNoWindow = true;
            ServerStartInfo.RedirectStandardOutput = true;
            ServerStartInfo.RedirectStandardInput = true;
            ServerStartInfo.RedirectStandardError = true;
            ServerStartInfo.UseShellExecute = false;
            Server.StartInfo = ServerStartInfo;
            Server.ErrorDataReceived += Server_Error;
            Server.OutputDataReceived += Server_Output;
            Server.Start();
            Server.BeginErrorReadLine();
            Server.BeginOutputReadLine();
            //Server.WaitForExit();
            #endregion
            
        }

        private void Server_Error(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == ">")
            {

            }
            else
            {
                MCOutput = e.Data;
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine(e.Data);
            }
        }

        private void Server_Output(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == ">")
            {

            }
            else
            {
                MCOutput = e.Data;
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine(e.Data);
            }
        }

        public void Run()
        {
            tcpServer.Start();
            new Thread(new ThreadStart(Receive)).Start();
        }

        public void Receive()
        {
            Console.WriteLine("Server started...");
            while (true)
            {
                TcpClient tmp = tcpServer.AcceptTcpClient();
                tcpStream = tmp.GetStream();
                Client connection = new Client();
                connection.nStream = tcpStream;
                connection.sReader = new StreamReader(tcpStream);
                connection.sWriter = new StreamWriter(tcpStream);
                Connection.Add(connection);
                Console.WriteLine("Client has connected!");
                Send();
            }
        }

        public void Send()
        {

            foreach (var connections in Connection)
            {
                try
                {
                    connections.sWriter.Write(MCOutput);
                    connections.sWriter.Flush();
                }
                catch
                {
                    Connection.Remove(connections);
                   
                }
            }
        }
    }
}


Client:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ServerData;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;


namespace Client
{
    class Program
    {
        const int PORT_NO = 8000;
        const string SERVER_IP = "127.0.0.1";
        static void Main(string[] args)
        {
         
            TcpClient client = new TcpClient(SERVER_IP, PORT_NO);
            NetworkStream nwStream = client.GetStream();
            byte[] buffer = new byte[2048];

            StringBuilder messageData = new StringBuilder();

            int bytes = -1;


            while (client.Connected)
            {
                    
                    bytes = nwStream.Read(buffer, 0, buffer.Length);

                    Decoder decoder = Encoding.UTF8.GetDecoder();
                    char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
                    decoder.GetChars(buffer, 0, bytes, chars, 0);

                    messageData.Append(chars);
                    Console.WriteLine(messageData.ToString());
            }


        }
    }
}


Hier ist das Problem was ich nicht verstehe
A: Lese ich den Stream mit diesen Code aus erhalte ich nur 1x mal die ausgabe.
Lese ich ihn aber mit einen StreamReader aus erhalte ich garnichts
B: Warum hält die schleife sozusagen bevor sie das 2x Console.WriteLine erreicht und überspringt dies?
C: Wie kann ich den Stream denn jetzt dauerhaft auslesen?

01.09.2014 - 04:03 Uhr

Hehe stimmt 😉

Nagut ich danke dir sehr, den rest schaffe ich wohl allein.
Ich wünsche noch eine schöne Nacht/Morgen

Mfg Odin

01.09.2014 - 03:56 Uhr

Ja ich brauche einfach nur die Adminrechte 😄

Ja natürlich hatte ich vorhher auch so doch hatte es dann geändern mit WindowsForms läuft das ja auch ohne Probleme

Ja ich werde die Datei wohl im Programm Ordner speichern müssen

01.09.2014 - 03:50 Uhr

Die läuft 😄
Meine Version hingegen nicht bei mir bleibt der StreamReader einfach leer bzw. die Settings weil er die nicht ließt

01.09.2014 - 03:43 Uhr

Lol Fehler 2 Die Anforderungsausführungsebene "requireAdministrator" wird von ClickOnce nicht unterstützt. Launcher

Das ist auch schön also kann ich das Programm nichtmal mit adminrechten starten lassen...

ConnectionString is nur leer weil ich die Informationen entfernt habe muss ja nicht jeder wissen 😄

Edit#

Ich habe trotzdem das Problem das der StreamReader einfach nichts einliest
somit bekomme ich Trotzdem den Fehler

01.09.2014 - 03:18 Uhr

Ohman wie du dich freust 😄
Gut dann haben wir es ja schonmal genauer 😄

Das is so geil 😄 ich kanns gar nicht testen wenn ich etwas ändere denn bei mir lief es ja vorhher schon ohne Probleme 😄

Edit:

Problem gefunden naja glaub ich
Ich habe mal meine Alte Settings file gelöscht damit der launcher diese neu erstellt und naja jetzt kommt der error wieder also liegts ja irgendwie an den Settings bzw der Settings file erstellen tut er sie

Der Fehler muss hier liegen:


 public static SCSettings Read(string TargetFile)
        {
            if (File.Exists(TargetFile))
            {
                SCSettings settings = null;
                try
                {
                    StreamReader reader = new StreamReader(TargetFile);
                    settings = JsonConvert.DeserializeObject<SCSettings>(reader.ReadToEnd());
                    reader.Close();
                    return settings;
                }
                catch (Exception ex)
                {
                    string title = "Read Error";
                    string message = "Couldn't parse Settings Json File: \n " + ex.Message +
                        "\n It could be that the structure has changed by the author \n" +
                        "Delete this file and generate a new one?";
                    DialogResult result = MessageBox.Show(message, title, MessageBoxButtons.YesNo);

                    switch (result)
                    {
                        case DialogResult.Yes:
                            File.Delete(TargetFile);
                            break;
                        case DialogResult.No:
                            return null;
                        default: // In case the user presses the X button.
                            return null;
                    }
                }
            }
            return null;
        }

Da die Settings IMMER null haben

Edit#
Der StreamReader bugt wohl denn er liest die Datei bei mir nicht mhh

01.09.2014 - 03:16 Uhr

Das mit den Settings kann bei dir daran liegen das er die Settings nicht erstellt
somit kann er sie auch nicht einlesen

01.09.2014 - 03:10 Uhr

lol, ich habs mir schon fast gedacht 😄
Naja Ich danke dir sehr.

Trotzdem komisch das es bei mir 1A läuft 😄

01.09.2014 - 02:34 Uhr

Habe dir die Projekt Mappe privat geschickt.

Das ist bestimmt wieder so einfach das man es einfach nicht findet 😄

01.09.2014 - 02:04 Uhr

Okay hab jetzt alles so gemacht wie in Thread steht doch wie gesagt debugger sagt mir nichts

Vieleicht hast du ja mehr Glück wende magst hier die neuere Version: [Entfernt]

01.09.2014 - 01:49 Uhr

Ja genau starte ich es vom Debug-Ordner oder vom Desktop wenn ich die Datei die ich dir geschickt habe auf dem Desktop ziehe und starte läuft es auch

Ja alle Dateien die ich dir gegeben habe sind wichtig damit das Programm richtig läuft.
Diese sind aber auch alle eingebunden und im Publish sind diese auf Einschließen (Erforderlich) makiert und werden bei gelegt.

01.09.2014 - 01:39 Uhr

Nein du benötigst einfach Winrar 5 😛

01.09.2014 - 01:36 Uhr

Das wird alles noch geändert das ist momentan eine frühe version.

01.09.2014 - 01:24 Uhr

Ja zum speichern der Settings etc..
Doch selbst mit "Mit Administrationsrechten starten" bringt garnichts

MainWindow:


///// Code auf Anfrage //////

Settings:


///// Code auf Anfrage //////

01.09.2014 - 01:13 Uhr

Visual C++ Redistributable ist Installiert!

Den Ordner kann ich nicht freigeben da das Programm ja nicht nur für uns beiden lokal nutzbar sein soll sondern für alle.
Der Launcher ist ja für unseren Game Server somit brauchen die Spieler ihn ja auch.
Also veröffentliche ich das Projekt auf einen FTP Server und mithilfe der Publish.htm kann der Spieler es dann installieren sowie die benötigten Komponenten von Microsoft. Doch auch bei ihnen läuft es nicht.

#Edit:

Auserdem wäre C++ Redistributable nicht installiert warum kann ich es dann auch nicht ausführen also die Publish Version?
Bei mir läuft ja ebend nur die direkte .exe vom Project aber nicht vom Publish dingens
Installieren kann ich es doch ausführen nicht!

01.09.2014 - 00:45 Uhr

Nabend,

Ich habe ein Problem welches ich nicht lösen kann da ich KEINE Fehlermeldungen bekomme.
Was ich gemacht habe:

Ich habe eine WPF Anwendung geschrieben, diese dann veröffentlicht.
Mein Bruder (Win 7) es installieren lassen und starten.
Dabei trat diese Meldung auf


Problemsignatur:
  Problemereignisname: CLR20r3
  Problemsignatur 01: Launcher.exe
  Problemsignatur 02: 2.0.14.8
  Problemsignatur 03: 5403876b
  Problemsignatur 04: mscorlib
  Problemsignatur 05: 4.0.30319.34209
  Problemsignatur 06: 534894cc
  Problemsignatur 07: 4527
  Problemsignatur 08: ce
  Problemsignatur 09: System.Windows.Markup.XamlParse
  Betriebsystemversion: 6.1.7600.2.0.0.256.1
  Gebietsschema-ID: 1031
  Zusatzinformation 1: 0a9e
  Zusatzinformation 2: 0a9e372d3b4ad19135b953a78882e789
  Zusatzinformation 3: 0a9e
  Zusatzinformation 4: 0a9e372d3b4ad19135b953a78882e789

Lesen Sie unsere Datenschutzbestimmungen online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0407

Wenn die Onlinedatenschutzbestimmungen nicht verfügbar sind, lesen Sie unsere Datenschutzbestimmungen offline:
  C:\Windows\system32\de-DE\erofflps.txt

Bei mir läuft es im Debug Mode und im Release Mode ohne probleme und ohne fehlermeldungen!
Installiere ich aber die veröffentlichte Version und starte diese dann öffnet es sich und schliesst sich sofort wieder (Laut Prozess Explorer) ich bekomme aber keine Meldungen mehr (Win 8)
Aber starte ich es auf dem Project Ordner herraus also direkt die .exe gibts keine Probleme und ich kann es starten mein bruder aber wiederum kann es auch so nicht starten.

Ich weiß nicht weiter... Wie löse ich das Problem? Was ist das Problem? Warum habe ich das Problem?
Hatte schon im Netz gesucht doch nichts passendes gefunden.

XAML Code:


<Window x:Class="Launcher.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Launcher" Height="524.221" Width="1034.596" WindowStartupLocation="CenterScreen" WindowStyle="None" ResizeMode="NoResize">
    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown_1">
        <Grid.Background>
            <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/minecraft1.jpg"/>
        </Grid.Background>
        <Rectangle Fill="#4CA2A2A2" HorizontalAlignment="Left" Height="137" Margin="0,388,0,-1" VerticalAlignment="Top" Width="1035"/>
        <Menu HorizontalAlignment="Left" Height="23" Margin="0,-1,0,0" VerticalAlignment="Top" Width="1035" Background="#4C6F6F72"/>
        <Button x:Name="btn_mini" Content="-" HorizontalAlignment="Left" Margin="984,0,0,0" VerticalAlignment="Top" Width="24" Click="btn_mini_Click" FontSize="14" FontWeight="Bold" Background="#59444343" Height="21" Foreground="White" ToolTip="Minimize"/>
        <Button Content="X" HorizontalAlignment="Left" Margin="1011,0,0,0" VerticalAlignment="Top" Width="24" Height="21" Background="#7FFF0000" Foreground="White" FontWeight="Bold" FontSize="14" Click="Button_Click" ToolTip="Close"/>
        <TextBox x:Name="txtUser" HorizontalAlignment="Left" Height="23" Margin="859,404,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="170" Background="#FFD1D1D1"/>
        <PasswordBox x:Name="txtPass" HorizontalAlignment="Left" Margin="859,442,0,0" VerticalAlignment="Top" Width="170" Height="23" Background="#FFCBCCCD" BorderBrush="#FFABADB3"/>
        <Label x:Name="lblUsername" Content="Username or E-Mail:" HorizontalAlignment="Left" Margin="853,382,0,0" VerticalAlignment="Top" Width="157" Foreground="White" Height="25"/>
        <Label x:Name="lblPass" Content="Password:" HorizontalAlignment="Left" Margin="855,420,0,0" VerticalAlignment="Top" Foreground="White"/>
        <Button x:Name="btn_Login" Content="Login" HorizontalAlignment="Left" Margin="859,490,0,0" VerticalAlignment="Top" Width="170" Background="#BFDDDDDD" Height="20" IsDefault="True" Click="btn_Login_Click"/>
        <Label x:Name="lblLoggedIn" Content="Status: Not logged in" HorizontalAlignment="Left" Margin="854,504,0,-6" VerticalAlignment="Top" Width="176" Height="26" Foreground="White"/>
        <Separator HorizontalAlignment="Left" Height="10" Margin="776,453,0,0" VerticalAlignment="Top" Width="139" RenderTransformOrigin="0.5,0.5">
            <Separator.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform Angle="-90.293"/>
                    <TranslateTransform/>
                </TransformGroup>
            </Separator.RenderTransform>
        </Separator>
        <Label Content="Shellcraft Launcher" HorizontalAlignment="Left" Margin="433,-9,0,0" VerticalAlignment="Top" Width="245" FontSize="20" Foreground="White"/>
        <Button x:Name="BtnSettings" Content="Settings" HorizontalAlignment="Left" Margin="6,401,0,0" VerticalAlignment="Top" Width="57" Height="50" Foreground="{x:Null}" BorderBrush="{x:Null}" Click="BtnSettings_Click" ToolTip="Settings">
            <Button.Background>
                <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/Settings.png" />
            </Button.Background>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="image" Source="pack://siteoforigin:,,,/Resources/Settings.png" Margin="8" />
                                    <TextBlock  x:Name="text" Text="ADD" Margin="3,0,3,0" VerticalAlignment="Center"></TextBlock>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter TargetName="image" Property="Source" Value="pack://siteoforigin:,,,/Resources/SettingsHover.png" />
                                        <Setter TargetName="text" Property="Opacity" Value=".5" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Style>

        </Button>
        <Button x:Name="btnMinecraftDir" Content="" HorizontalAlignment="Left" Margin="68,401,0,0" VerticalAlignment="Top" Width="52" Height="50" ToolTip="Open Minecraft Directory" BorderBrush="{x:Null}" Foreground="{x:Null}" Click="btnMinecraftDir_Click">
            <Button.Background>
                <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/Repair.png" Stretch="None"/>
            </Button.Background>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="image" Source="pack://siteoforigin:,,,/Resources/Repair.png" Margin="8" />
                                    <TextBlock  x:Name="text" Text="ADD" Margin="3,0,3,0" VerticalAlignment="Center"></TextBlock>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter TargetName="image" Property="Source" Value="pack://siteoforigin:,,,/Resources/RepairHover.png" />
                                        <Setter TargetName="text" Property="Opacity" Value=".5" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Style>
        </Button>
        <TextBox x:Name="txtNews" HorizontalAlignment="Left" Height="135" Margin="139,389,0,0" TextWrapping="Wrap" Text="Hier kommen die News rein" VerticalAlignment="Top" Width="706" Background="{x:Null}" Foreground="White" BorderBrush="{x:Null}"/>
        <Button x:Name="btnUpdates" Content="Button" HorizontalAlignment="Left" Margin="7,456,0,0" VerticalAlignment="Top" Width="56" Height="45" Foreground="{x:Null}" RenderTransformOrigin="0.509,0.54" BorderBrush="{x:Null}" ToolTip="Check for Updates" Click="btnUpdates_Click">
            <Button.Background>
                <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/CheckUpdates.png"/>
            </Button.Background>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="image" Source="pack://siteoforigin:,,,/Resources/CheckUpdates.png" Margin="8" />
                                    <TextBlock  x:Name="text" Text="ADD" Margin="3,0,3,0" VerticalAlignment="Center"></TextBlock>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter TargetName="image" Property="Source" Value="pack://siteoforigin:,,,/Resources/CheckUpdatesHover.png" />
                                        <Setter TargetName="text" Property="Opacity" Value=".5" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Style>
        </Button>
        <Separator HorizontalAlignment="Left" Height="10" Margin="68,453,0,0" VerticalAlignment="Top" Width="139" RenderTransformOrigin="0.5,0.5">
            <Separator.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform Angle="-90.293"/>
                    <TranslateTransform/>
                </TransformGroup>
            </Separator.RenderTransform>
        </Separator>
        <Button x:Name="btnHelp" Content="Button" HorizontalAlignment="Left" Margin="68,456,0,0" VerticalAlignment="Top" Width="52" Height="45" ToolTip="Help" BorderBrush="{x:Null}" Foreground="{x:Null}">
            <Button.Background>
                <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/Help.png"/>
            </Button.Background>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="image" Source="pack://siteoforigin:,,,/Resources/Help.png" Margin="8" />
                                    <TextBlock  x:Name="text" Text="ADD" Margin="3,0,3,0" VerticalAlignment="Center"></TextBlock>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter TargetName="image" Property="Source" Value="pack://siteoforigin:,,,/Resources/HelpHover.png" />
                                        <Setter TargetName="text" Property="Opacity" Value=".5" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Style>
        </Button>
        <CheckBox x:Name="checkRemember" Content="Remember me" HorizontalAlignment="Left" Margin="859,470,0,0" VerticalAlignment="Top" Width="166" Background="#FFC1C1C1" BorderBrush="{x:Null}" Foreground="White"/>
        <Label x:Name="lblVersion" Content="Label" HorizontalAlignment="Left" Margin="54,504,0,-6" VerticalAlignment="Top" Width="95" Foreground="White"/>
    </Grid>
</Window>



Mfg Odin

29.08.2014 - 14:10 Uhr

Moin,

Ich habe mal wieder ein Problem undzwar das MouseHover Event
dieses Standart Event erzeugt ja nur ein Highlight auf dem Button doch dieses lässt sofern der Button ein Bild hat das Bild verschwinden bzw. bedeckt es. Wie kann ich das ändern z.B so das wenn ich die Maus draufhalte nur der Rahmen des Buttons dieses Highlight bekommt und nicht der gesamte Button?

PS: Bin noch Anfänger der WPF's

#Edit
Gelöst.

Gelöst habe ich es so. ResourceDictionary:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="ButtonsMenue1" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="#02FFFFFF" />

        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Padding" Value="1" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Template">

            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">

                    <Grid Background="{TemplateBinding Background}">

                        <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                              Margin="10"
                                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                              RecognizesAccessKey="True"
                                                              TextBlock.FontFamily="Segoe WP Light"
                                                              TextBlock.Foreground="Black"
                                                              TextBlock.FontSize="14"

                                                              />

                        <Rectangle x:Name="border" 
                                                           SnapsToDevicePixels="True"
                                                           IsHitTestVisible="False" 
                                                           Opacity="0.25"
                                                           Width="10" Height="20" VerticalAlignment="Stretch" HorizontalAlignment="Right" 
                                                           Fill="DarkGray" Margin="15,0,0,0" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="contentPresenter" Property="Opacity" Value="1" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="False">
                            <Setter TargetName="contentPresenter" Property="Opacity" Value=".5" />
                        </Trigger>
                        <Trigger Property="IsKeyboardFocused" Value="true" />
                        <Trigger Property="ToggleButton.IsChecked" Value="true" />
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="White" />
                        </Trigger>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
                            <Setter TargetName="border" Property="Rectangle.Width" Value="2"/>
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

</ResourceDictionary>

Der Button:


<Button x:Name="BtnSettings" Content="Settings" HorizontalAlignment="Left" Margin="6,401,0,0" VerticalAlignment="Top" Width="57" Height="50" Foreground="{x:Null}" BorderBrush="{x:Null}" Click="BtnSettings_Click" ToolTip="Settings">
            <Button.Background>
                <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/Settings.png" />
            </Button.Background>
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="image" Source="pack://siteoforigin:,,,/Resources/Settings.png" Margin="8" />
                                    <TextBlock  x:Name="text" Text="ADD" Margin="3,0,3,0" VerticalAlignment="Center"></TextBlock>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter TargetName="image" Property="Source" Value="pack://siteoforigin:,,,/Resources/SettingsHover.png" />
                                        <Setter TargetName="text" Property="Opacity" Value=".5" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Button.Style>

        </Button>

Mfg Odin