Hilfe suche nach einem Bild in der Imglist

  • VB.NET

Es gibt 67 Antworten in diesem Thema. Der letzte Beitrag () ist von Dfgpoint.

    »Dauerhaft« ist Einstellungssache. Im wahrsten Sinne des Wortes. Eine For-Schleife wiederholt sich nur so oft wie man es festlegt. Wie Du mit ner For-Schleife durch die in der Liste angezeigten Icons durchgehst, weißt Du?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Oha, gut zu wissen. Das sind absolute Programmiergrundlagen. Ohne die kommst Du bei keinem Projekt sehr weit. Ich hatte vermutet, dass das Spiel von Dir ist. Aber wenn nicht, stellt sich die Frage, warum der Entwickler des Spiels (ist doch jemand aus Deinem Bekanntenkreis, oder?) da nix gegen das Cheaten unternimmt. Vor allem: Was hast Du davon, wenn Du einen Cheat-Programm-Detektor hast, wenn Du nicht der Entwickler bist? Dann müsstest Du ja alle Mitspieler dazu bringen/zwingen, Dein AntiCheatProgramm laufen zu lassen. Ich versteh grad Dein Ziel nicht, welches Du mit Deinem Programm erreichen willst.
    Da hast Du noch einen seeehhhr weiten Weg vor Dir. Da jetzt weitermachen, bis Du das aktuelle Problem gelöst, bringt da nicht so viel. Du hast dann ein mehr oder weniger komplexes Programm, was zwar läuft, aber welches Du nicht in den wichtigen Punkten verstehst. Your choice.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das Spiel ist Privates Spiel welches schon Fertig ist es lauft aber auf einem Server von uns und für dieses Spiel gibt es sozu sagen nur ein richtigen Hack welcher sehr Nervig ist denn will ich damit verstören.
    Die anderen Kennen sich bei sowas auch nicht aus deshalb wollte ich mal mein Glück versuchen.
    Aba naja schade das es nichts wird.
    Trozdem Danke für deine ganze Hilfe und Zeit.
    Ich habe nicht gesagt, dass es nicht machbar ist, sondern nur, dass Du am Ende ein Programm hast, welches Du ggf. nicht im vollen Außmaße verstehst.
    Hat denn der Spielentwickler noch die Möglichkeit, was an dem Spiel zu ändern?
    Wenn alle den Hack kennen, warum nutzen ihn die anderen und wie willst Du sie dazu bringen, Dein Programm aufzuspielen, damit sie ihn nicht nutzen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Damit der Thread nicht offen endet:

    Zuerst einmalig das verdächtige Icon richtig speichern:
    dabei ist x der nullbasierte Index innerhalb Deiner ImageList. Musst eben durchzählen, welches das richtige Icon ist.

    VB.NET-Quellcode

    1. ImgList.Images(x).Save("(hier einen gültigen Pfad (also Ordner plus Dateiname, endend auf BMP) eingeben)", Imaging.ImageFormat.Bmp)


    Und die pixelgenaue Bildvergleichssub:

    VB.NET-Quellcode

    1. Dim ReferenceBitmap = New Bitmap(Bitmap.FromFile("(Dateipfad (s. oben) zum verdächtigen Icon)"))
    2. Dim ComparisonBitmap As Bitmap = Nothing
    3. Dim PixelColorInComparisonBitmap As Color
    4. Dim PixelColorInReferenceBitmap As Color
    5. For Each Icon As Image In ImgList.Images
    6. ComparisonBitmap = New Bitmap(Icon)
    7. For x = 0 To ComparisonBitmap.Width - 1
    8. For y = 0 To ComparisonBitmap.Height - 1
    9. PixelColorInComparisonBitmap = ComparisonBitmap.GetPixel(x, y)
    10. PixelColorInReferenceBitmap = ReferenceBitmap.GetPixel(x, y)
    11. If PixelColorInComparisonBitmap.R <> PixelColorInReferenceBitmap.R OrElse
    12. PixelColorInComparisonBitmap.G <> PixelColorInReferenceBitmap.G OrElse
    13. PixelColorInComparisonBitmap.B <> PixelColorInReferenceBitmap.B Then
    14. Exit Sub
    15. End If
    16. Next
    17. Next
    18. MessageBox.Show("OMG! A Cheater!")
    19. Exit Sub
    20. Next
    21. End Sub

    Sollte der Cheatprogrammhersteller aber auch nur 1 Pixel im Icon abändern, greift Dein Abwehrprogramm nicht mehr.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ist es auch Möglich das dass gesuchte Bild nicht irgendwo abgespeichert wird sondern im Programm bleibt weil sonst ist es recht leicht ihn zu umgehen. und vielen vielen dank dafür. :)
    Und leider wird das Bild nicht erkannt. ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dfgpoint“ ()

    Bei mir hat es zuerst auch nicht geklappt, da eine falsche Bildgröße erzeugt wird, wenn man Icon direkt abspeichert. Aber nachdem ich das Icon mit ImgList.Images(x).Save("(hier einen gültigen Pfad (also Ordner plus Dateiname, endend auf BMP) eingeben)", Imaging.ImageFormat.Bmp) gespeichert hatte, ging es. Hast Du das Icon auch so gespeichert? Wenn ja, schau mal bitte nach, welche Maße (Höhe, Breite) es in der neuen Datei hat. Es muss 32x32 sein.
    Klar kannst Dun das Bild im Projekt selbst abspeichern. Dafür gibt es die Ressourcen (Projekt -> Projekteigenschaften -> Ressourcen -> bei "Ressource hinzufügen" auf [v] und Vorhandene Datei auswählen, dann Dein Vergleichsbild einfügen. Dann kannst Du auch danach im Programmcode mit My.Resources.(Dateiname) drauf zugreifen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    1. Oh Mann, wie komm ich denn auf 32x32? 16x16 ist natürlich die richtige Icongröße.
    2. Wie würde RodFromGermany schreiben: "Falls Du diesen Code kopierst, achte auf die C&P-Bremse." => in Zeile 15 ist das Exit Sub falsch. Die Sub würde nach dem 1 fehlgeschlagenen Vergleich abbrechen. Daher nochmal richtig:

    VB.NET-Quellcode

    1. Dim ReferenceBitmap = New Bitmap(PbSuspiciousIcon.Image)
    2. Dim ComparisonBitmap As Bitmap = Nothing
    3. Dim PixelColorInComparisonBitmap As Color
    4. Dim PixelColorInReferenceBitmap As Color
    5. For Each Icon As Image In ImgList.Images
    6. ComparisonBitmap = New Bitmap(Icon)
    7. Do
    8. For x = 0 To ComparisonBitmap.Width - 1
    9. For y = 0 To ComparisonBitmap.Height - 1
    10. PixelColorInComparisonBitmap = ComparisonBitmap.GetPixel(x, y)
    11. PixelColorInReferenceBitmap = ReferenceBitmap.GetPixel(x, y)
    12. If PixelColorInComparisonBitmap.R <> PixelColorInReferenceBitmap.R OrElse
    13. PixelColorInComparisonBitmap.G <> PixelColorInReferenceBitmap.G OrElse
    14. PixelColorInComparisonBitmap.B <> PixelColorInReferenceBitmap.B Then
    15. Exit Do
    16. End If
    17. Next
    18. Next
    19. MessageBox.Show("OMG! A Cheater!")
    20. Exit Sub
    21. Loop
    22. Next

    Anmerkung: Die "Do-Loop-Schleife" (moppelt gedoppelt, da loop = Schleife => Tautologie) ist nur ein Hack, um sowohl das böse GoTo also auch sinnvolle Strukturierung erstmal zu vermeiden und alles in einer Sub zu belassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Woran das wohl liegt? Ich hab eben ne PicBox namens "PbSuspiciousIcon", in der mein gesuchtes Icon drin ist. Einfach den Namen Deiner PicBox einsetzen - wenn das Icon dort reingeladen wird. Ok, hätte ich dazu schreiben können, aber ich dachte, das ergibt sich automatisch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dfgpoint schrieb:

    der Datei Name raus gefunden werden könnte
    Dann solltest Du Dir eine gemeinsame Liste anlegen mit Icons und Namen, gugst Du Dictionary(Of T1, T2).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was genau meinst du. ?( mein gesamter code schaut nun so aus. :)

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Me.Hide()
    4. Timer1.Start()
    5. Timer2.Start()
    6. End Sub
    7. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    8. For Each proc As Process In Process.GetProcesses
    9. Try
    10. ImgList.Images.Add(Icon.ExtractAssociatedIcon(proc.MainModule.FileName))
    11. Dim lvi As New ListViewItem(proc.ProcessName, ImgList.Images.Count - 1)
    12. lvi.SubItems.Add(proc.MainModule.FileName)
    13. ListView1.Items.Add(lvi)
    14. Catch ex As Exception
    15. End Try
    16. Next
    17. End Sub
    18. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    19. Dim ReferenceBitmap = New Bitmap(PbSuspiciousIcon.Image)
    20. Dim ComparisonBitmap As Bitmap = Nothing
    21. Dim PixelColorInComparisonBitmap As Color
    22. Dim PixelColorInReferenceBitmap As Color
    23. For Each Icon As Image In ImgList.Images
    24. ComparisonBitmap = New Bitmap(Icon)
    25. Do
    26. For x = 0 To ComparisonBitmap.Width - 1
    27. For y = 0 To ComparisonBitmap.Height - 1
    28. PixelColorInComparisonBitmap = ComparisonBitmap.GetPixel(x, y)
    29. PixelColorInReferenceBitmap = ReferenceBitmap.GetPixel(x, y)
    30. If PixelColorInComparisonBitmap.R <> PixelColorInReferenceBitmap.R OrElse
    31. PixelColorInComparisonBitmap.G <> PixelColorInReferenceBitmap.G OrElse
    32. PixelColorInComparisonBitmap.B <> PixelColorInReferenceBitmap.B Then
    33. Exit Do
    34. End If
    35. Next
    36. Next
    37. Exit Sub
    38. Loop
    39. Next
    40. ListView1.Clear()
    41. End Sub
    42. End Class
    Ehm ... warum listest Du die Prozesse eig. auf? Wenn Du die Prozesse durchgehst, kannst Du doch gleich deren Icons mit dem Suchicon vergleichen. Und dann hast Du auch sofort den entsprechenden Prozess-/Dateinamen. Das erspart Dir n Timer. Kommt natürlich drauf an, wie die Timer derzeigt getaktet sind. Alle wieviel Sekunden/Minuten "ticken" denn die Timer?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.