Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Jack_AI
Thema: Pokerprojekt - Hilfe gesucht
Am im Forum: Smalltalk

Hallo.

Ich weiß nicht, ob es dir bewusst ist, aber es gibt bereits solch ein Programm namens Poker Tracker.

Grüße,
Jack

Thema: GDI+: FPS und Zeit zeichnen - überfordert?
Am im Forum: Grafik und Sound

OK, ich habe festgestellt, dass das Problem an der Logik lag. Es hat mit dem Zeichnen an sich nichts zu tun.

Allerdings habe ich gerade ein andere Problem bemerkt:
Ich habe ja meine Endlosschleife, in der alle paar Millisekunden das Bild neu gezeichnet wird. Allerdings wird das Bild auch neu gezeichnet, wenn das Bild durch andere Umstände (z.B. wenn ich ein anderes Fenster darüber ziehe) neu gezeichnet werden muss. Dadurch werden wird die Darstellung beschleunigt. Wie kann ich das verhindern?

Thema: GDI+: FPS und Zeit zeichnen - überfordert?
Am im Forum: Grafik und Sound

Zitat von Andreas.May
Normal sollte die Berechnung von deinen vorangegangenen Thread nicht wirklich belastent sein. So das ich eher andere Fehlerquellen vermute - nur dazu brauche ich die Zeichenroutine von dir + Aufruf als Code zum sichten.

Ich weiß nicht, ob dir das wirklich helfen wird. Ich poste das hier einfach mal. Hoffnung habe ich nicht wirklich.

Konstruktor:


    public Form1()
    {
      InitializeComponent();

      ...

      // EventHandler
      pn_Flaeche.Paint += new PaintEventHandler(pn_Flaeche_Paint);

      // Timer
      RefreshTimer = new Timer();
      RefreshTimer.Interval = Convert.ToInt32((1 / (double)ClassGlobal.FPS) * 1000); // FPS = 30
      RefreshTimer.Tick += new EventHandler(RefreshTimer_Tick);
    }

    // Timer-Ticks
    void RefreshTimer_Tick(object sender, EventArgs e)
    {
      ClassGlobal.Time++;
      pn_Flaeche.Invalidate(); 
    }

Zeichen-Routine:


    void pn_Flaeche_Paint(object sender, PaintEventArgs e)
    {      
      if (ClassGlobal.ProgramStarted)
      {
        if (Objektliste.Count > 0)
        {
          foreach (ClassObject Objekt in Objektliste)
          {
            // Hinweis: Problem tritt schon bei nur einem Objekt auf
            Objekt.DoYourJob(e.Graphics); // Objekt wird gezeichnet und Bewegung wird berechnet
          }
        }

        // Zeit anzeigen
        e.Graphics.DrawString(Math.Round(ClassGlobal.SITime(), 1).ToString(), new Font("Times New Roman", 12, FontStyle.Regular), 
          Brushes.Black, new PointF(ClassGlobal.Bildbreite - 50, ClassGlobal.Bildhoehe - 30));
      }
    }

Was mir aufgefallen ist: Wenn sich das Objekt nur auf der X- oder Y-Achse bewegt, tritt dieser Effekt nicht. Für "schräge" Bewegungen werden mehr Berechnungen gebraucht. Daher vermute ich, dass entweder die komplexeren Rechungen einen Fehler enthalten (was ich eigentlich ausschließe), oder diese Berechnungen zu viel Zeit brauchen.

Thema: GDI+: FPS und Zeit zeichnen - überfordert?
Am im Forum: Grafik und Sound

Das ist gar nicht mein Problem.

Ich stelle meine Frage noch einmal anders:
Was passiert denn, wenn das Programm für die Berechnungen länger braucht, als den Bruchteil einer Sekunde, den ich dem Programm zur Verfügung stelle? Ich sage dem Programm ja, "Hey, Programm! Berechne das Ganze in 40ms noch mal neu!" - "Und wenn ich das in der Zeit nicht schaffe, mein Gebieter?" - "Dann... dann..." Ja, was dann?

Thema: GDI+: FPS und Zeit zeichnen - überfordert?
Am im Forum: Grafik und Sound

Hallo.

Ich versuche mit GDI+ die Bewegung eines Objektes zu realisieren. Dazu lasse ich, wie in diesem Thread geschildert, ein Objekt von einem Punkt zum anderen wandern. Zuerst wollte ich das so lösen, dass die Bilder nach einer vorgegebenen Zeit aktualisiert werden. Dazu habe ich anfangs mit 30 Aktualisierungen pro Sekunde gearbeitet (30 Bilder/Sekunde = 30 FPS).

Allerdings ist ein merkwürdiger Fehler aufgetreten: Das Objekt "springt" plötzlich, obwohl es sich geradeaus bewegen soll. Als ich die feste FPS-Rate auf 100 erhöht habe, trat dieser "Sprung" früher auf, als ich sie gesenkt habe, trat er früher oder gar nicht auf.

Auf dem Bildschirm wird zudem eine Zeitanzeige angezeigt, die auf die erste Nachkommastelle genau immer die Zeit seit Programmstart anzeigen soll. (Auf erste Nachkommastelle genau heißt also, dass sie zumindest alle 1/10 Sekunden aktualisiert werden soll). Aber schon bei 10 FPS tritt dieser Fehler auf.

Mein Verdacht ist also, dass durch die festgegebene Frequenz das Programm mit den vielen Berechnungen pro Sekunde nicht ganz fertig wird, und so die Berechnungen verfälscht werden (die Zeit fließt in die Berechnung mit ein). Ist dieser Verdacht berechtigt? Wenn ja, müsste ich es anders realisieren. Aber wie halte ich dann die Uhrzeit aktuell?

Danke im Voraus,
euer verzweifelter Jack

Thema: Codebeispiele für Banking software?
Am im Forum: Smalltalk

Hallo.

Ich würde gerne ein Programm schreiben. In das Programm kann man seine Kontonummer, seine Bankleitzahl und einen Betrag reinschreiben, und anschließend wird der Betrag von diesem Konto auf meines überwiesen. Lässt sich das mit C# realisieren? Hat jemand einen Codeschnippsel dafür?

Danke im Voraus,
Jack

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Zitat von Jelly
Ich versteh nicht recht... Die Steigung geht doch gar nicht mehr in deine Berechnung ein.

Du hast recht. Daran habe ich gar nicht mehr gedacht. Richtig lösen konnte ich das Problem nicht. Dafür müsste ich erst wieder meine Mathekenntnisse auffrischen. Schon dieses vermeintlich einfache Problem hat jetzt vorerst genug mathematisches und physikalisches Wissen von mir abverlangt.

Die Lösung:

Ich konnte das Ganze nun entgültig lösen. Die Formel war übrigens nicht ganz richtig. Richtig ist die Formel so (im Vergleich zur vorherigen falschen Formel nähme die Geschwindigkeit konstant zu):


      if (PosX < ZielX)
        NextPosX = StartPosX + Speed * Zeit * CosWinkel;
      else
        NextPosX = StartPosX - Speed * Zeit * CosWinkel;

      if (PosY < ZielY)
        NextPosY = StartPosY + Speed * Zeit * SinWinkel;
      else
        NextPosY = StartPosY - Speed * Zeit * SinWinkel;

Ich versuche hier noch mal grob meine Gedanken zu dokumentieren, damit andere Anfänger und Fortgeschrittene mit dem selben Problem zumindest mal ein paar Ausgangspunkte haben.

Das Problem war, dass ich im Rückblick auf meinen ersten Ansatz sehr viele Dinge falsch angegangen bin, und wenn man nur einen Fehler behebt, die Bewegung noch immer total unlogisch verläuft. Deshalb ist es schwer, eine Fehlerquelle allein durch Ausprobieren auszuheben.

Wie man den Winkel zwischen zwei Punkten herausfinden kann:


      double TanWinkel;

      if (DeltaX() == 0)
        TanWinkel = 0;
      else
        TanWinkel = DeltaY() / DeltaX();

      double Winkel = Math.Atan(TanWinkel);

Wichtig ist hierbei zu schauen, dass DeltaX nicht Null werden darf. DeltaX und DeltaY steht jeweils für die Differenz zwischen der X- bzw. Y-Koordinate von Position und Ziel. Der Cosinus und Sinus des Winkels fließen dann in die obere Formel ein. Einfachheitshalber mache ich Folgendes:


      if (DeltaX() == 0)
      {
        CosWinkel = 0;
        SinWinkel = 1;
      }

      if (DeltaY() == 0)
      {
        CosWinkel = 1;
        SinWinkel = 0;
      }

Das bedeutet, dass wenn das Ziel sich nur in einer der beiden Achsen vom Ursprung unterscheidet, die betroffene Koordinate konstant bleibt.

Beispiel:
Aktuelle Position ist 100/200 und das Ziel hat die Koordinaten 100/400. Das Objekt würde sich also nur auf der X-Achse verschieben. Es wandert also nach rechts, bildlich gesprochen. Damit wird DeltaX = 0. Nach meinem Code wird damit auch der Cosinus = 0, was dazu führt, dass die Formel

NextPosX = StartPosX + Speed * Zeit * CosWinkel;

immer den Wert der Startposition behält. Im Fall des Beispiels 100.

Was genau ist die Zeit?

Die Zeit in der Formel ist die Zeit, die seit dem Start der Bewegung vergangen ist. In meinem Beispiel lasse ich die Bewegung erst nach einer Sekunde starten. Dementsprechend fängt die Zeit auch erst an, nachdem eine Sekunde vergangen ist:


    private double ZeitSeitBewegung(bool Set)
    {
      if (Set)
      {
        if (ZeitpunktBewegung == 0)
          ZeitpunktBewegung = ClassGlobal.SITime();
      }

      double ZeitSeitBeweg = ClassGlobal.SITime() - ZeitpunktBewegung;

      return ZeitSeitBeweg;
    }

SiTime() ist die Zeit, die seit Programmstart vergangen ist, in Sekunden. ZeitpunktBewegung ist ein Feld des Objekts.

Ich habe das Setzen der Zeit mit einer Variable "Set" geknüpft, da die Funktion später noch mal aufgerufen wird, um die aktuelle Zeit auszugeben, aber hier die Zeit nicht gesetzt werden soll.

Problem: Mein Objekt schießt über das Ziel hinaus und verhält sich danach komisch.

Um dieses Problem abzufangen, muss überprüft werden, ob das Objekt nicht im nächsten Schritt über das Ziel hinausschießt. Das Ziel pixelgenau zu treffen ist sehr unwahrscheinlich. Daher folgender Code:


      if (CosWinkel == 0)   
      {
        if ((ZielY ≥ PosY && ZielY ≤ NextPosY) || (ZielY ≤ PosY && ZielY > NextPosY))
        {
          ZielWurdeErreicht();
          return true;
        }
      }
      else if (SinWinkel == 0)
      {
        if ((ZielX ≥ PosX && ZielX ≤ NextPosX) || (ZielX ≤ PosX && ZielX > NextPosX))
        {
          ZielWurdeErreicht();
          return true;
        }
      }
      else
      {
        // wenn das Ziel zwischen der aktuellen und der nächsten Position liegt
        if ((ZielX ≥ PosX && ZielX ≤ NextPosX) || (ZielY ≥ PosY && ZielY ≤ NextPosY) ||
          (ZielX ≤ PosX && ZielX > NextPosX) || (ZielY ≤ PosY && ZielY > NextPosY))
        {
          ZielWurdeErreicht();
          return true;
        }
      }

Die Fallunterscheidung hängt mit dem oben beschriebenen Fall zusammen, dass sich das Objekt nur auf einer Achse bewegt. Für einen solchen Fall testen wir einfach, ob das Objekt mit dem nächsten Schritt auf der anderen Achse das Ziel überschreiten würde. Ansonsten wird geprüft, ob das Ziel auf einer der beiden Achsen überschritten werden würde. Normalerweise sollte es auf beiden Achsen gleichzeitig überschritten werden. Aber das trifft wahrscheinlich nur bei sehr kleinen (oder großen?) Bewegungseinheiten zu.

Ich hoffe, ich konnte meine Überlegungen verständlich machen, und dieser Beitrag dem ein oder anderen hilft. Ich hoffe auch, dass auf meiner Seite diesbezüglich keine weiteren Probleme mehr auftreten.

Jack

edit: Ach ja. Und Danke noch mal an alle, die mir hier geholfen haben! Ohne euren "Stupps in die richtige Richtung zur richtigen Zeit" hätte ich das wahrscheinlich nie hinbekommen und aufgegeben.

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Oh, wow. Ich habe es endlich hinbekommen! Ich behaupte einfach mal, dass ich das Problem jetzt gelöst habe, lasse mich aber gerne eines Besseren belehren. Wenn meine Lösung jetzt stimmt, schreibe ich nachträglich noch einen (längeren?) Beitrag, für all diejenigen, die mit den gleichen Problemen zu kämpfen haben werden, und gehe dabei auf meine gemachten Fehler ein.

Die entscheidende Stelle sieht jetzt so aus:


      double NextPosX;
      double NextPosY;

      // Formeln müssen für größeres / kleineres Ziel angepasst werden

      if (PosX < ZielX)
        NextPosX = StartPosX + StartPosX * Speed * Zeit * Math.Cos(WertWinkel);
      else 
        NextPosX = StartPosX - StartPosX * Speed * Zeit * Math.Cos(WertWinkel);

      if (PosY < ZielY)
        NextPosY = StartPosY + StartPosY * Speed * Zeit * Math.Sin(WertWinkel);
      else
        NextPosY = StartPosY - StartPosY * Speed * Zeit * Math.Sin(WertWinkel);

      // wenn das Ziel zwischen der aktuellen und der nächsten Position liegt
      if ((ZielX ≥ PosX && ZielX ≤ NextPosX) || (ZielY ≥ PosY && ZielY ≤ NextPosY) ||
        (ZielX ≤ PosX && ZielX > NextPosX) || (ZielY ≤ PosY && ZielY > NextPosY))
      {
        ZielWurdeErreicht();
        return true;
      }

      PosX = NextPosX;
      PosY = NextPosY;

      return false;

Was ich allerdings noch nicht behoben habe, ist, wie man vorgeht, wenn DeltaX 0 wird:


      if (DeltaX() != 0)
        Steigung = DeltaY() / DeltaX();
      else
        Steigung = ???

Wenn mir hier noch jemand auf die Sprünge helfen könnte, wäre das sehr nett.
Jack

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Hallo.

Ich habe jetzt einen neuen Ansatz, nachdem Cosinus und Sinus zu merkwürdigem Verhalten geführt haben:

PosX = StartPosX + StartPosX * Speed * Zeit;
PosY = StartPosX + StartPosY * Speed * Zeit * Steigung;

Doch das führt auch zu einem merkwürdigen Problem. Das Objekt steuert das Ziel richtig an, aber nach ca. 3/4 der Strecke nimmt das Objekt zufällige Positionen an. Es "tanzt wild herum", sozusagen. Ich kann mir dieses Verhalten nicht erklären.

Und noch eine dumme Frage:


      double Steigung;

      if (DeltaX() != 0)
        Steigung = DeltaY() / DeltaX();
      else
        ???

Wie behandle ich die Steigung, wenn DeltaX gleich Null ist?

Danke,
Jack

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Mit dieser Formel


      PosX = PosX - (ZeitpunktBewegung * Speed * CosWinkel);
      PosY = PosY - (ZeitpunktBewegung * Speed * SinWinkel);

habe ich das Problem, dass mein Objekt zuerst wendet, bevor es das Ziel ansteuert, und dabei an Geschwindigkeit zunimmt.

Mein Programm (.exe-Datei) (Position ist 400/400, Ziel ist 600/1)

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung


      double CosWinkel = (PosX * ZielX + PosY * ZielY) / 
        (Math.Sqrt(Math.Pow(PosX, 2) + Math.Pow(PosY, 2)) * 
        Math.Sqrt(Math.Pow(ZielX, 2) + Math.Pow(ZielY, 2)));
      double Winkel = Math.Acos(CosWinkel);

Ich habe mit mal das Ergebnis von "Winkel" ausgeben lassen. Das scheint irgendwie nicht zu stimmen. Wenn das Ziel die Koordinaten 1/1 hat und Position die Koordinaten 400/400, muss logischerweise der Winkel 45° sein, bzw. 315°. Ich bekomme aber als Ergebnis 1,49 * 10 hoch -8! (Als Bogenmaß interpretiert wäre der Winkel immerhin noch 8,5 * 10 hoch -7)

edit:
Oh, wow! Ich glaube, ich hab's jetzt! Ein Freund hat mich auf die Formel


      double TanWinkel = (PosY - ZielY) / (PosX - ZielX);
      double Winkel = Math.Atan(TanWinkel);

aufmerksam gemacht. Und siehe da: Wenn ich das Ergebnis als Bogenmaß interpretiere, bekomme ich einen Winkel von 45 Grad raus!

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

@O5IRI5:

Danke für deinen ausführlichen Hinweis! Leider habe ich überhaupt keine Ahnung von Vektoren, sonst hätte ich selber versucht es mit Vektoren zu berechnen.

@N1ls:

Zitat von N1ls
Zitat von Jack_AI
Mein Ansatz wäre:

cos a = (X1 * X2 + Y1 * Y2) / (sqrt(X1² + Y1²) * sqrt(X2² + Y2²))
...

Ich hab keine Ahnung, wie Du auf diese Formel kommst und ob diese annaehrend korrekt sein kann. Fuer mich persoenlich muss grundsaetzlich ein Minus-Zeichen in einer Formel auftauchen, wenn aus Koordinatenpaaren ein Winkel berechnet werden soll.

Gruesse,

N1ls

Hallo N1ls,

die Formel habe ich von hier. Ich habe lediglich die Z-Dimension vernachlässigt.

Grüße,
Jack

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Zitat von Seyyedi
Frohes Neues :-)
Dir auch!
Zitat von Seyyedi
Hab die Formel jetzt selber gar nicht untersucht -- aber ein häufiger Fehler ist, dass mit int werten gerechnet wird -- sind bei dir PosX, ZielX, PosY und ZielY alle vom Typ double?
Ja, sind alle double. Es stimmt: Zuvor habe ich int benutzt, was zu merkwürdigen Fehlern geführt hat.

Thema: Mathematisches Problem: Koordinaten
Am im Forum: Rund um die Programmierung

Hallo!

Ich möchte in C# ein Objekt1 auf Objekt2 zugehen lassen. Gegeben sind also die Koordinaten von Objekt1 und Objekt2 und die Geschwindigkeit von Objekt1. Dazu suche ich eine Formel, mit der ich die Position von Objekt1 zum Zeitpunkt t herausfinden kann.

Mein Ansatz wäre:

cos a = (X1 * X2 + Y1 * Y2) / (sqrt(X1² + Y1²) * sqrt(X2² + Y2²))
X1 = X1 - X1 * t * v * cos a
Y1 = Y1 - Y1 * t * v * cos a

bzw. in C#-Code:


double CosWinkel = (PosX * ZielX + PosY * ZielY) / 
  (Math.Sqrt(Math.Pow(PosX, 2) + Math.Pow(PosY, 2)) * 
  Math.Sqrt(Math.Pow(ZielX, 2) + Math.Pow(ZielY, 2)));
PosX = (PosX - PosX * ZeitpunktBewegung * Speed * CosWinkel);
PosY = (PosY - PosY * ZeitpunktBewegung * Speed * CosWinkel);

Allerdings haut das irgendwie nicht hin. Das Ergebnis ist, dass Objekt1 immer nach links oben fährt, unabhängig vom Ziel (was eigentlich durch das cos a verhindert werden soll). Ich habe versucht, die Formel durch Probieren herauszufinden, was aber an meinen geringen Physikkenntnissen gescheitert ist.

Wenn mir jemand hier helfen könnte, wäre das janz doll. Danke.

Thema: XMLReader und Equal, nein, das lass sein...
Am im Forum: Datentechnologien

Vielen Dank.

Ich habe das Problem jetzt lösen können, indem ich zuvor den Nodetyp verglichen habe. Danke für den entscheidenden Tipp. Dass es ohne vorherigen Vergleich jedoch gar nicht geht, finde ich ziemlich merkwürdig. Es wird wohl aber einer Logik folgen.

Jack

Thema: XMLReader und Equal, nein, das lass sein...
Am im Forum: Datentechnologien

Hallo.
Ja, das habe ich auch probiert. Leider auch keine Reaktion.

Thema: XMLReader und Equal, nein, das lass sein...
Am im Forum: Datentechnologien

Der Debugger sagt leider gar nix.

Thema: XMLReader und Equal, nein, das lass sein...
Am im Forum: Datentechnologien

Hallo.

Ich stehe eben auf dem Schlauch. Ich habe folgenden Code:


XmlTextReader xreader = new XmlTextReader(Datei);

while (xreader.Read())
{
  if (xreader.Name.Equals("elementname")) // <- hier, der entscheidende Punkt
  {
    //weitere Anweisungen
  }
}

Leider wird die If-Anweisung nie ausgelöst, obwohl das Element existiert. Die Rechtschreibung stimmt. Wenn ich alle Elemente ausgeben lasse, kommt das Element auch vor. Ich vermute einen Logikfehler meinerseits, konnte aber trotz längerer Suche keine Lösung finden.

Danke für den entsprechenden Hinweis im Voraus.

Jack

Thema: C# auf PDA
Am im Forum: Rund um die Programmierung

Ich habe mich noch nie näher mit Mono befasst, da ich auch nie mit Linux zu tun habe, hört sich aber ziemlich klasse an. Aber na gut, wo wir gerade schon so stark richtung Mono abgeschwiffen sind, versuche ich mal elegant Mono und PDA wieder zusammenzuführen:

Wie funktioniert das eigentlich, wenn ich ein C#-Programm geschrieben habe, das die Klasse "SpecialDirectories" benutzt? SpecialDirectories dient eigentlich dazu, Pfadangaben zu den Eigenen Dateien und ähnliches zu erhalten. Ich bezweifle aber stark, dass ein PDA / Linux das hat.

Ansonsten wäre es mir auch recht, wenn jemand noch ein paar Fragen aus meinem ersten Posting beantworten könnte.

Jack

PS und edit:
@egrath: Danke für deinen Hinweis mit dem N770/N800. Das PDA ist bei mir jetzt in der engeren Auswahl.

Thema: C# auf PDA
Am im Forum: Rund um die Programmierung

Hallo egrath,

vielen Dank schon mal für die ausführliche Antwort. Deine Idee hört sich wirklich vielversprechend an. Bedeutet das also, dass ich im Gegensatz zu Windows-Mobile-PDAs auf das ganze .NET-Spektrum zugreifen kann? Das wäre ein ziemlicher Vorteil.

Grüße,
Jack

Weitere Meinungen und Erfahrungen sehr gerne willkommen!

Thema: C# auf PDA
Am im Forum: Rund um die Programmierung

Hallo!

Ich spiele derzeit mit dem Gedanken mit ein PDA zuzulegen. Auf dem PDA möchte ich auch selber programmierte C#-Applikationen (offline und online) benutzen. Soweit ich mitbekommen habe, soll das mit dem Compact Framework möglich sein.

Vor dem Kauf würde ich aber gerne noch von euch wissen:
- Welche Erfahrungen habt ihr mit C# in Verbindung mit einem PDA gemacht?
- Was muss ich beim Kauf eines PDAs beachten?
- Welche Erfahrungen habt ihr mit der W-LAN-Fähigkeit eines PDAs gemacht? (Zuverlässigkeit, Reichweite...) (Ist W-LAN und WiFi eigentlich das selbe?)
- sonstige Anmerkungen

Danke im Voraus für das Teilen eurer Erfahrung,
Jack

Thema: Fremde Website auslesen (mit Sessions)
Am im Forum: Rund um die Programmierung

Hallo herbivore,

ich habe den Tipp mit "Button auf Website ausprobiert". Ich muss erstmal sagen, dass ich ganz erstaunt bin, dass es überhaupt solche Funktionen gibt. Ich habe dabei weitestgehend deinen Beispiel-Code übernommen und dabei die Control-IDs angepasst. Einloggen funktioniert auch, allerdings legt er scheinbar kein Cookie an. Wenn ich eine Unterseite auf der Website mit einem StreamReader auslesen möchte, wirft er mich wieder zur Login-Seite zurück.

Jack

Thema: Fremde Website auslesen (mit Sessions)
Am im Forum: Rund um die Programmierung

Hallo.

Ich würde gerne an den HTML-Quellcode einer fremden Website gelangen. Normalerweise funktioniert das ganz gut, nur bei Websites mit Login (also solche, die mit Sessions arbeiten) funktioniert das Ganze nicht.

Mein Lösungsansatz wäre gewesen, die Cookie-Dateien auf dem Computer nach einer Session-ID zu durchsuchen und der Website als URL-Variable mitzugeben. Allerdings dauert das sehr lange, da die ganzen temporären Dateien durchsucht werden müssen. Und davon gibt es meist sehr viele. Außerdem muss der Variablenname der Session-ID stimmen, und ich weiß nicht, wie ich ihn finde (im Quellcode nicht, da PHP?). Ich hoffe, das Problem ist nachvollziehbar.

Deswegen, als Zusammenfassung:
- Gibt es einen bewährten, schnellen Weg so eine Website auszulesen?
- Ist es moralisch, so ein Programm weiterzugeben, auch wenn es etwas ganz harmloses tut? Ich habe Bedenken, weil Sessions doch ein sicherheitskritisches Thema ist und der Rechner dafür durchsucht werden muss.

Danke,
Jack

Thema: [erledigt] SendKeys wandelt ^ in & um
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich versuche es jetzt mit keybd_event() im Zusammenspiel mit der Keys-Enumeration.

SendMessage() verlangt für mich, als fortgeschrittenen Anfänger, ziemlich merkwürdige Parameter, bzw. weiß ich nicht, wie man diese Parameter richtig marshallt. Also lieber keybd_event().

Meine Lösung wäre nur das Zirkumflex durch keybd_event() zu ersetzen und für alle anderen Zeichen SendKeys zu verwenden. Für alle, die es interessiert: Das Zirkumflex ist oem5.

Jack

PS: Ich habe gerade entdeckt, dass es das Problem schon früher einmal gab.

Thema: [erledigt] SendKeys wandelt ^ in & um
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Mh. Na gut. Danke fürs Testen. Dann muss ich / man eben auf die dll-Funktion zugreifen.

Danke,
Jack

Thema: [erledigt] SendKeys wandelt ^ in & um
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das Problem ist, dass wenn ich nur die Zeile SendKeys.SendWait("{^}"); eingebe, ein Und-Zeichen dabei rauskommt. Ich habe auch probiert, das Zirkumflex als ASCII-Nummer ( char(94).ToString() ) anzugeben. Er macht trotzdem ein Und-Zeichen daraus.

Zitat
Original von 0815Coder
^ wird ja auch nicht angezeigt, wenn du es einmal an der tastatur eingibst. erst wenn du danach space drückst, kommt das ^. vielleicht musst du einfach zwei SendKeys absetzen (bzw einen mit space hinterher).

Daran habe ich auch schon gedacht und es so ausprobiert. Das Ergebnis: Er wandelt das Zirkumflex in ein Und-Zeichen um und setzt dahinter ein Leerzeichen. Nicht unbedingt befriedigend...

Jack



Nachtrag:
Vielleicht kann hier ein Freiwilliger das Problem mit VS 2005 testen. Einfach einen Button erstellen und dann für das button.Click-Event:


Thread.Sleep(3000); // 3 Sekunden warten
SendKeys.SendWait("{^}");

Nach dem Klick auf den Button innerhalb von 3 Sekunden auf eine beliebige Textbox klicken (Texteditor z.B.) und dann schauen, welches Zeichen dabei rauskommt. Nur als kleine Idee.

Thema: [erledigt] SendKeys wandelt ^ in & um
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo.

Ich habe ein Problem mit dem Befehl SendKeys.SendWait. Wenn ich den Befehl SendKeys.SendWait("{^}"); ausführe, schreibt er kein Zirkumflex ^, sondern stattdessen ein Und-Zeichen &. Ich habe alle Sonderzeichen ausprobiert, die nach MSDN mit geschweiften Klammern angegeben werden sollen, aber nur das Zirkumflex wird vertauscht.

Ansonsten verwende ich zum Umwandeln diesen Code, aber auch wenn ich den Befehl direkt benutze wird es vertauscht:


      // bestimmte Zeichen müssen für SendWait in Format {x} gebracht werden
      char[] BoeseZeichen = new char[] { '^', '%', '~', '+', '(', ')', '{', '}', '[', ']' };

      string ZeichenToSend = String.Empty;
      
      for (int i = 0; i < Text.Length; i++)
      {
        ZeichenToSend = Text[i].ToString();

        foreach (char Zeichen in BoeseZeichen)
        {
          if (Text[i].Equals(Zeichen))
            ZeichenToSend = "{" + Text[i].ToString() + "}";
        }

        SendKeys.SendWait(ZeichenToSend); // alternativ: SendKeys.SendWait("{^}");
      }

Ist das Zirkumflex ein Spezialfall, oder bin ich nur wieder zu blöd?

Grüße,
Jack

Thema: Maus Sperren
Am im Forum: GUI: Windows-Forms

Ah, klar. Mausposition-ändern ist "Cursor.Position = Point".

Thema: Maus Sperren
Am im Forum: GUI: Windows-Forms

Könnte man stattdessen nicht auch einen Thread mit höchster Priorität (höher als Maus) erstellen und den mit Sleep blockieren? Geht das überhaupt?

Jack

Thema: [erledigt] StreamReader verschluckt erstes Zeichen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ach klasse. Hab's schon:


  while ((AktuelleZeile = Reader.ReadLine()) != null)
  {
    MessageBox.Show(AktuelleZeile);
  }

Manchmal sieht man die Lösung vor lauter Vakuum nicht.

Jack