Hütchenspieler Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 (bearbeitet) @duffyduck12Man braucht nur für den gewünschten Bildausschnitt einen Hash-Wert ermitteln und vergleicht diesen mit zuvor gespeicherten Werten.So wird’s gemacht.Denke aber, dass ihn so etwas noch mehr verwirrt, zumal er zunächst solche Probleme hatte:Ausserdem müsste die Bildaufnahme sehr genau arbeiten, um zwei exakt gleiche Bilder zu erhalten, um sie z.B. nach Dateigröße vergleichen zu können.@Zocker85schau mal nach FindWindow();GetWindowRect();LGHütchenspieler bearbeitet Oktober 19, 2010 von Hütchenspieler
Gast Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 @duffyduck12Wie bei vielen Programmierern betrifft meine Arbeit nur einen sehr speziellen Teilbereich. Von OCR hatte ich eben keine Ahnung.Was kein Problem ist, ist das Vergleichen der Bitmaps mit SHA256hash, so wie ichs jetzt auch umgesetzt hab (Pixel für Pixel vergleich ich natürlich nicht!)das ganze sieht etwa so auspublic static bool AreBitmapsEqual(Bitmap pic1, Bitmap pic2) { if (Bitmap.ReferenceEquals(pic1, pic2)) return true; if (!pic1.Width.Equals(pic2.Width)) return false; if (!pic1.Height.Equals(pic2.Height)) return false; if (!pic1.PixelFormat.Equals(pic2.PixelFormat)) return false; try { ImageConverter conv = new ImageConverter(); Byte[] imgBytes1 = new Byte[1]; Byte[] imgBytes2 = new Byte[1]; imgBytes1 = (Byte[])conv.ConvertTo(pic1, imgBytes1.GetType()); imgBytes2 = (Byte[])conv.ConvertTo(pic2, imgBytes2.GetType()); SHA256Managed sha = new SHA256Managed(); Byte[] imgHash1 = sha.ComputeHash(imgBytes1); Byte[] imgHash2 = sha.ComputeHash(imgBytes2); for (int i = 0; i < imgHash1.Length && i < imgHash2.Length; i++) { if (!imgHash1[i].Equals(imgHash2[i])) return false; } return true; } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } }und wie holst du dir die Fensterposition des "Online-Roulette"-Fensters, dass ja nicht zum eigentlichen Programm gehört?Wie kannst du dieses Fenster über Code ansprechen???
Gast Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 @Hüttenspieler:FindWindow();GetWindowRect();DAS hab ich gesucht! Danke!
rennschnecke Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 Ich würde mir nur ein paar einzelne Bildpunkte speichern.Die meisten OCs ändern die Farbe auf dem Feld, das getroffen wurde.Die beiden Zustände sollte man versuchen zu erkennen.
Hütchenspieler Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 Hier wurde das Thema übrigens schon einmal behandelt:http://www.roulette-forum.de/OC-Zahlen-aus...amp;hl=auslesenLGHütchenspieler
Gast Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 ...Was kein Problem ist, ist das Vergleichen der Bitmaps mit SHA256hash...Genau so sollte es meiner Meinung nach nicht laufen!Du vergleichst immer noch zwei Bitmaps:Also ein Soll-/Ist-Vergleich auf Pixelebene.Dazu muss jedes Bitmap als Vorlage zunächst gespeichert und für Vergleichszweckewieder aufgerufen werden.Es reicht jedoch, die Hash-Werte (Prüfsummen) zu speichern und für den aktuellen Vergleichheranzuziehen. Das ist wesentlich effizienter und übersichtlicher.Natürlich gibt es viele Lösungswege für ein Problem. Ich tendiere jedoch immer zu einerressourcenschonenden Programmierung, auch wenn die Hardware heutzutage Leistung im Überfluss bietet.
Gast Geschrieben Oktober 19, 2010 Geschrieben Oktober 19, 2010 hm, absolut logisch!das werde ich machen! danke!
Hütchenspieler Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 (bearbeitet) @Hüttenspieler:FindWindow();GetWindowRect();DAS hab ich gesucht! Danke!Dazu noch ein kleiner Hinweis.Bei mir gab es dabei ein kleines Problem mit unterschiedlichen Betriebssystemen, was aber nur am Anzeigedesign und nicht am Betriebssystem lag. Wenn unterschiedliche Designs verwendet werden (Windows klassisch, XP Stil, ...) muss die Höhe ggf. leicht nachjustiert werden, weil die Fensterrahmen oben unterschiedlich breit sein können. LGHütchenspieler bearbeitet Oktober 20, 2010 von Hütchenspieler
Gast Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 Sowas hab ich schon vermutet. Aber das ist verkraftbar.Nächste Frage: wie hast du mit FindWindow() den "richtigen" Prozess geholt?Also ich habs jetzt do gelöst:Mit dieser Funktion Wird dem Benutzer in einer ComboBox eine Liste aller ProzessFensterNamen bereitgestellt:[DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount); public static List<string> GetWindowNames() { StringBuilder title; string strTemp; List<string> lstProcessTitels = new List<string>(); foreach (Process p in Process.GetProcesses()) { title = new StringBuilder(); GetWindowText(p.MainWindowHandle, title, int.MaxValue); strTemp = title.ToString(); if (!String.IsNullOrEmpty(strTemp.Trim())) lstProcessTitels.Add(strTemp); } return lstProcessTitels; }Wenn er danach einen ProzessTitel ausgewält hat, greift diese Funktion für die Position des Fensters: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr FindWindow(string strClassName, string strWindowName); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle rect); public static Point GetWindowPosition(string strWindowName) { IntPtr WindowHandle = FindWindow(null, strWindowName); Rectangle rect = new Rectangle(); GetWindowRect(WindowHandle, ref rect); return new Point(rect.X, rect.Y); }Weist du da noch was besseres (evtl. ohne Benutzer-Eingabe)?
Hütchenspieler Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 (bearbeitet) Habe stumpf den Fenstertitel gesucht. (Bei DB gibt es ja nur 2 Tische)Ungefähr so:CWnd *casinofenster;casinofenster = FindWindow(NULL,TEXT("DublinBet.com - Roulette 1"));if (casinofenster != NULL ){ gefunden = 1; casinofenster->GetWindowRect(Position); casino_x = Position->left; casino_y = Position->top; casinofenster->SetForegroundWindow();}if(gefunden == 0){ casinofenster = FindWindow(NULL,TEXT("DublinBet.com - Roulette 2")); if (casinofenster != NULL ) { gefunden = 1; casinofenster->GetWindowRect(Position); casino_x = Position->left; casino_y = Position->top; casinofenster->SetForegroundWindow(); }}if(gefunden == 0){ wie oben die Tische mit hohen Einsätzen prüfen... (haben etwas andere Namen)}if(gefunden == 0){ AfxMessageBox("Casino konnte nicht gefunden werden ..... ");}LGHütchenspieler bearbeitet Oktober 20, 2010 von Hütchenspieler
Faustan Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 Moin Hütchen,gehen nicht auch Platzhalter? "DublinBet*Roulette*" . Sparste wieder 8 Zeilen. Man kann ja eh nur einen Tisch offen haben.
Hütchenspieler Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 (bearbeitet) Ich sach immer:Im Zweifel lieber kopieren statt kapieren. Wildcards mag FindWindow nicht. Aber das ist verkraftbar.Ist kein Thema. Nimm einfach einen kleinen Bildausschnitt, der sich nicht verändert. Beim Start kannst du dann kurz checken, bei welcher Höhe der Hashwert passt.Die Fensterposition besorge ich mir vor jeder Aktion neu, falls der User das Fenster mal mal verschiebt. LGHütchenspieler bearbeitet Oktober 20, 2010 von Hütchenspieler
Optimierer Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 (bearbeitet) Ich sach immer:Im Zweifel lieber kopieren statt kapieren. LOL – der ist gut. Aber ihr sprecht anscheinend nicht die gleiche Sprache. C# von Zocker85 erkenn' ich, aber was ist das Zeug von dir, Hütchenspieler? C++ eventuell, da muss ich leider passen. @Zocker85: Wenn du schon die Liste der Fensternamen dem Benutzer zeigen kannst, dann kannst du doch im Programm auch gleich selber die Liste durchlaufen und das passende Fenster wählen. Danke euch für den Code... lasst' nur dich nicht abhalten mehr davon zu posten, (C# wenn möglich) mir ist kopieren manchmal auch am liebsten. Da hat man gleich mal eine Ausgangsbasis :Gruß, Optimierer bearbeitet Oktober 20, 2010 von Optimierer
Hütchenspieler Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 Hallo Opti,Genau, das ist C++. Letztlich geht es hier um den Aufruf von API-Funktionen.Das ist aus nahezu jeder Sprache möglich. Welche Sprache brauchst Du?LGHütchenspieler
Optimierer Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 Genau, das ist C++. Letztlich geht es hier um den Aufruf von API-Funktionen.Das ist aus nahezu jeder Sprache möglich.Ist schon klar.Welche Sprache brauchst Du?Am besten C# oder J#oder auch JavaFx. Es soll auch eine Perl-Variante geben, mit der man richtige Anwendungen basteln kann.Nur C++ kenne ich leider überhaupt nicht .Gruß, Optimierer
Hütchenspieler Geschrieben Oktober 20, 2010 Geschrieben Oktober 20, 2010 Hallo Opti,bei C# frag doch mal bei Zocker85 nach.LgHütchenspieler
Gast Geschrieben Oktober 21, 2010 Geschrieben Oktober 21, 2010 Guten Morgen,@OptimiererWenn du schon die Liste der Fensternamen dem Benutzer zeigen kannst, dann kannst du doch im Programm auch gleich selber die Liste durchlaufen und das passende Fenster wählen.Ich möchte mit diesem Programm sehr variabel sein, das heißt, wenn ich ein neues Online Casino finde, das ich testen will, will ich später nicht mehr im SourceCode rumspielen müssen.Aber jetzt klappts auch mit Combobox sehr angenehm. (siehe Screenshot links oben)Danke euch für den Code... lasst' nur dich nicht abhalten mehr davon zu posten, (C# wenn möglich) mir ist kopieren manchmal auch am liebsten. Da hat man gleich mal eine AusgangsbasisWenn mein Prog fertig ist, werde ich hier im Forum eine Demo-Version kostenlos online stellen.FALLS die gut ankommt, werde ich über einen kleinen Verkauf nachdenken. (zu einem fairen Preis)Wer an SoureCode interessiert ist: da kann man dann schon was machen. (kleine Fetzen poste ich gern ins Forum, wenn jemand ne spezielle Frage hat)Sonderwünsche mit einbauen ist auch (meistens) kein Stress.
rennschnecke Geschrieben Oktober 21, 2010 Geschrieben Oktober 21, 2010 An sich ist es ja egal, WIE man das alles realisiert.Ich habe mein Programm zB mit AutoIt umgesetzt, was ich in einer Nacht (zumindest die Grundzüge) gelernt habe!Der Compiler hat eine wahnsinnig gute Hilfe dabei.
Gast Geschrieben Oktober 21, 2010 Geschrieben Oktober 21, 2010 ...Aber jetzt klappts auch mit Combobox sehr angenehm. (siehe Screenshot links oben)...Also wenn der User schon alles per Mausklick deinem Programm zeigen soll,dann kann er doch auch das Casinofenster per Klick auf z.B. die Titelleiste auswählen!
trizero Geschrieben November 17, 2010 Geschrieben November 17, 2010 Mit http://jocr.sourceforge.net/ klappts.Und wieder die Spielverderberfrage: Wozu einen Bot, ohne ein gewinnendes System?Passiv dem Bankrott zusehen?!(trotzdem) Viel Glück!
baboon Geschrieben November 18, 2010 Geschrieben November 18, 2010 interessantes Thema :-)Bin selbst auch Softwareentwickler und hatte mir das auch immer vorgenommen, ansich ja keine allzu komplezierte Sache. Das schwierigste ist wohl die Zahlenerkennung.Allerdings lohnt sich die ganze Sache ja wirklich nur wenn man ein gewinnbringendes System hat, da muss ich meinem Vorposter recht gebene.
Gast Geschrieben November 18, 2010 Geschrieben November 18, 2010 Also ich bin noch am Programmieren! hab leider am Abend nicht immer Bock, dran weiter zu arbeiten, weil ich bei der Arbeit den ganzen Tag schon vorm PC sitze. Aber ich konnte schon mal etwas testen. Das Programm läuft auf jeden Fall! Aber mir fallen immer wieder neue Sachen ein, die ich noch umsetzen kann. (Naja, ich denk mir: Wenn dann gscheit!)Das mit dem System ist natürlich noch ein anderes Thema Mit http://jocr.sourceforge.net/ klappts.Das wäre auch meine erste Wahl gewesen, aber da das mit der Methode "Bild in Hash umwandeln und Hashes vergleichen" super funktioniert, bin ich dabei geblieben. Vorteil: Fehl-Erkennung einer Zahl ist ausgeschlossen, da nicht die Zahl selber erkannt wird, sondern das Bild, auf dem die Zahl drauf ist. Nachteil: wenn man in einem OC spielen will, muss man erstmal alle Bilder (bzw. Hashes) der Zahlen abspreichern. Das geht aber relativ flott. In 5 Minuten ist ein Online Casino komplett in meiner Software abgespeichert, mit sämtlichen Zahlen und Koordinaten.Ich freu mich schon, wenns fertig ist und ich hier ein Demo präsentieren kann. Ich will bis Weihnachten fertig sein, dann hab ich Urlaub und Zeit zum testen.
msoprofi Geschrieben Dezember 18, 2010 Geschrieben Dezember 18, 2010 (bearbeitet) Also ich bin noch am Programmieren! hab leider am Abend nicht immer Bock, dran weiter zu arbeiten, weil ich bei der Arbeit den ganzen Tag schon vorm PC sitze. Aber ich konnte schon mal etwas testen. Das Programm läuft auf jeden Fall! Aber mir fallen immer wieder neue Sachen ein, die ich noch umsetzen kann. (Naja, ich denk mir: Wenn dann gscheit!)Das mit dem System ist natürlich noch ein anderes Thema Das wäre auch meine erste Wahl gewesen, aber da das mit der Methode "Bild in Hash umwandeln und Hashes vergleichen" super funktioniert, bin ich dabei geblieben. Vorteil: Fehl-Erkennung einer Zahl ist ausgeschlossen, da nicht die Zahl selber erkannt wird, sondern das Bild, auf dem die Zahl drauf ist. Nachteil: wenn man in einem OC spielen will, muss man erstmal alle Bilder (bzw. Hashes) der Zahlen abspreichern. Das geht aber relativ flott. In 5 Minuten ist ein Online Casino komplett in meiner Software abgespeichert, mit sämtlichen Zahlen und Koordinaten.Ich freu mich schon, wenns fertig ist und ich hier ein Demo präsentieren kann. Ich will bis Weihnachten fertig sein, dann hab ich Urlaub und Zeit zum testen. Lange Rede kurzer Sinn.Es muß kein Super intelligentes System sein, um Roulettezahlen einzulesen.Auch nicht wenn man die Casionos wechselt und andere Zahlen Bilder bekommt.Ich lese hier dauernd .... Ich bin (angehender) Programmierer ... ???Punkt 1. Bestimme den einzulesenden Bildschirmausschnitt.Punkt 2. Lese diesen ein, und vergleiche ob er schon bekannt und spezifiziert wurde.Wenn er bekannt war, ermittelt das Programm einfach die Zahl,wenn er nicht bekannt war, fragt das Programm (genau 1 mal) nach, welche Ziffer es darstellt.... und spezifiziert sie.Ich hab mir tatsache noch die Mühe gemacht, daß in VBA und MS-Excel (und API's )zu programmieren.Die Möglichkeiten mit Net-Framework machen dies gerade-zu zu einem Kinderspiel.Allerdings nur, wenn man wirklich schon ein bischen Programmierer ist.Mein Excel - Tool spielt jedenfalls stundenlang absolut selbstständig, nach vorgegebenen Strategien. (Selbstverständlich Online)Allerdings ..... gewinnt es genau so wenig wie ich ....Bei ernsthaftem Interesse wurde ich den VBA-Code einstellen,möchte danach aber nicht mit Fragen gelöchert werden :-)Gruß MsoProfi bearbeitet Dezember 18, 2010 von msoprofi
Mike32 Geschrieben Dezember 19, 2010 Geschrieben Dezember 19, 2010 @msoprofiWäre mal eine gute Idee, wenn du den VBA-Code als Datei zum runterladen rienstellen könntest. GrüßeMike32Lange Rede kurzer Sinn.Es muß kein Super intelligentes System sein, um Roulettezahlen einzulesen.Auch nicht wenn man die Casionos wechselt und andere Zahlen Bilder bekommt.Ich lese hier dauernd .... Ich bin (angehender) Programmierer ... ???Punkt 1. Bestimme den einzulesenden Bildschirmausschnitt.Punkt 2. Lese diesen ein, und vergleiche ob er schon bekannt und spezifiziert wurde.Wenn er bekannt war, ermittelt das Programm einfach die Zahl,wenn er nicht bekannt war, fragt das Programm (genau 1 mal) nach, welche Ziffer es darstellt.... und spezifiziert sie.Ich hab mir tatsache noch die Mühe gemacht, daß in VBA und MS-Excel (und API's )zu programmieren.Die Möglichkeiten mit Net-Framework machen dies gerade-zu zu einem Kinderspiel.Allerdings nur, wenn man wirklich schon ein bischen Programmierer ist.Mein Excel - Tool spielt jedenfalls stundenlang absolut selbstständig, nach vorgegebenen Strategien. (Selbstverständlich Online)Allerdings ..... gewinnt es genau so wenig wie ich ....Bei ernsthaftem Interesse wurde ich den VBA-Code einstellen,möchte danach aber nicht mit Fragen gelöchert werden :-)Gruß MsoProfi
silentstrings Geschrieben Dezember 20, 2010 Geschrieben Dezember 20, 2010 ...<Bei ernsthaftem Interesse wurde ich den VBA-Code einstellen,möchte danach aber nicht mit Fragen gelöchert werden :-)...Hallo MSO Profi,ernsthaftes Interesse besteht definitiv. Wäre super, wenn Du Dein Material zur Verfügung stellen könntest. Quasi als Weihnachtsgeschenk DankeGrußsilent
Recommended Posts
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden