Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Errore strano searchBitmap
Forum - C# / VB.NET - Errore strano searchBitmap

Avatar
Valcars92 (Normal User)
Newbie


Messaggi: 20
Iscritto: 17/07/2021

Segnala al moderatore
Postato alle 19:18
Giovedì, 05/08/2021
Salve a tutti e buonasera....ho creato un programmino che trova un colore bitmap sullo schermo prende le coordinate e muove il mouse su di esso premendo il click.... ora quando lo avvio sul desktop e tento di aprire una cartella inserendo il bitmap dell'icona funziona correttamente e non mi da problemi....se invece provo ad aprire un'altra applicazione ad esempio un gioco prendo un bitmap della schermata del gioco e con il gioco aperto avvio il programma mi succede che avvolte funziona correttamente mentre il piu delle volte si blocca senza darmi errore e ne nulla volevo sapere se sbaglio in qualcosa.... ecco lo script

Codice sorgente - presumibilmente C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace MacroGame
  12. {
  13.     public partial class form_MacroGamer : Form
  14.     {
  15.  
  16.         //This is a replacement for Cursor.Position in WinForms
  17.         [System.Runtime.InteropServices.DllImport("user32.dll")]
  18.         static extern bool SetCursorPos(int x, int y);
  19.  
  20.         [System.Runtime.InteropServices.DllImport("user32.dll")]
  21.         public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
  22.  
  23.         public const int MOUSEEVENTF_LEFTDOWN = 0x02;
  24.         public const int MOUSEEVENTF_LEFTUP = 0x04;
  25.  
  26.  
  27.         public form_MacroGamer()
  28.         {
  29.             InitializeComponent();
  30.         }
  31.  
  32.         private void bt_1_Click(object sender, EventArgs e)
  33.         {
  34.             //Prendiamo il contenuto della textbox
  35.             string _tb = tb_1.Text;
  36.             try
  37.             {
  38.                 SearchPixel(_tb);
  39.             }
  40.             catch(Exception ex)
  41.             {
  42.                 MessageBox.Show(ex.ToString());
  43.                 return;
  44.             }
  45.            
  46.  
  47.         }
  48.  
  49.         private bool SearchPixel(string hexcode)
  50.         {
  51.             //Crea un immagine vuota
  52.             //Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
  53.             Bitmap bitmap = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
  54.             //Crea un nuovo oggetto graphi per catturare lo screen
  55.             Graphics graphics = Graphics.FromImage(bitmap as Image);
  56.  
  57.             //Screenshot moment -> screen contento to graphics object
  58.             graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
  59.             Color desiredPixelColor = ColorTranslator.FromHtml(hexcode);
  60.  
  61.  
  62.             for (int x = 0; x < SystemInformation.VirtualScreen.Width; x++)
  63.             {
  64.                 for (int y = 0; y < SystemInformation.VirtualScreen.Height; y++)
  65.                 {
  66.  
  67.                     //Get current pixel
  68.                     Color currentPixelColor = bitmap.GetPixel(x, y);
  69.  
  70.                     if (desiredPixelColor == currentPixelColor)
  71.                     {
  72.                         MessageBox.Show(String.Format("Trovato Pixel a {0},{1} - Adesso set mouse cursor", x, y));
  73.                         try
  74.                         {
  75.                             LeftMouseClick(x, y);
  76.                             System.Threading.Thread.Sleep(250);
  77.                             LeftMouseClick(x, y);
  78.                         }
  79.                         catch(Exception ex)
  80.                         {
  81.                             MessageBox.Show(ex.ToString());
  82.                             return false;
  83.                         }
  84.                         return true;
  85.                     }
  86.                 }
  87.             }
  88.             return false;
  89.         }
  90.  
  91.         //This simulates a left mouse click
  92.         public static void LeftMouseClick(int xpos, int ypos)
  93.         {
  94.             SetCursorPos(xpos, ypos);
  95.             mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0);
  96.             mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0);
  97.         }
  98.     }
  99. }



grazie in anticipo come sempre

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2090
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:13
Venerdì, 06/08/2021
Non ne sono molto sicuro, Ma credo che il discorso non sia risolvibile su due linee.

Una cosa è catturare grafica generata dalle GDI un'altra è catturare dei repaint dove agisce la GPU su DirectX o OpenGL, dove il suo ciclo di clear e velocissimo. quindi teoricamente dovrebbe apparirti tutto nero nella screen.

Prima di tutto, dovresti ancorarti sul gioco tramite un hook. Sai un pò tipo come quando vengono creati i Cheat.
successivamente, l'SDK delle DirectX offre diverse soluzioni per catturare schermate.

Tipo ottenendo il FrontBuffer, da non confondere con il BackBuffer che agisce su render.
Magari creando anche una sorta di swapchain o un render target su cui deviare e salvare la grafica renderizzata.

Per ottenere maggiori risultati consiglio di farlo in C++ dove si hanno possibilità presso che infinite.
Ciò non toglie il fatto che può essere eseguito anche da C#.
Ma bisogna conoscere bene il funzionamento delle DirectX.


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6172
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:45
Venerdì, 06/08/2021
Che gioco è? Roulette online? Altro bot?

Ma perché perdete tempo con queste cose?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Valcars92 (Normal User)
Newbie


Messaggi: 20
Iscritto: 17/07/2021

Segnala al moderatore
Postato alle 11:38
Venerdì, 06/08/2021
Grazie TheJuster proverò a studiarmi quello che mi hai suggerito ^_^......

=================================

Che gioco è? Roulette online? Altro bot?

Ma perché perdete tempo con queste cose?



In realtà è un gioco offline in 2D... tipo pokemon per dirtela tutta
Poi non ci vedo nulla di male perchè la mia intenzione non è creare bot ecc ma è capire come funziona un bot....o come funziona un determinato programma....


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6172
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:46
Venerdì, 06/08/2021
Io sono convinto che studiare seriamente programmazione non si fa cominciando con i bot.

Chi segue questa strada è solo un lamer, ovviamente secondo me.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2090
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:24
Sabato, 07/08/2021
Cmq sia, ti conviene dare ascolto a nessuno.

Senza conoscere nemmeno bene il linguaggio su cui vuoi fare una determinata cosa è una perdita di tempo oltretutto
anche poco costruttiva.

Oltre a non apprendere niente, riuscirai solo a confonderti li idee.
Se proprio vuoi complicarti la vita, prova a creare un gioco o un engine.

E sicuramente imparerai più di quello che ti aspettavi di conoscere esattamente come è successo a me
scrivendo Mire Engine.

Se non conosci nemmeno come funziona la memoria, o accederci tramite puntatori, è inutile fare tentativi a vuoto.
Oltre a quello, serve pure assembly e non un linguaggio per ragazzi, ma estremamente difficile.



PM Quote
Avatar
Valcars92 (Normal User)
Newbie


Messaggi: 20
Iscritto: 17/07/2021

Segnala al moderatore
Postato alle 22:02
Sabato, 07/08/2021
si ragazzi avete pienamente ragione...anche io me ne sto accorgendo che sto solo confondendo tutto.....ma io non è che ho voluto imparare questi linguaggi x creare virus o cazzate scusatemi il temine .....ma la mia è curiosità di capire come funziona una determinata cosa....però capisco che sono cose + grandi di me al momento e quindi credo che andro passo passo...scusatemi se ho postato qualcosa che non dovevo ma vi ripeto l'ho fatto senza malizia e senza cattiveria xke la mia era solo curiosita.....alla fine penso che non sono l'unico che ha iniziato così...mi dispiace che nessuno mi ha dato del lamer anche se non me lo ha detto chiaro e tondo ma si è capito e onestamente mi sono sentito un pò offesò...xo accetto anche questo d auna persone che reputo migliore di me su questo campo,,,,in ogni caso io ho solo voglia di imparare e spero di essere ben accettato in questo forum...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6172
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:08
Domenica, 08/08/2021
Quelli che intraprendono la strada che stai per imboccare tu sono lamer e non hanno concluso nulla, ma tu sei in tempo per fermarti. E c'è poco da rifletterci su.

Se sei curioso e vuoi andare a fondo, studia per bene - dalle basi - l'architettura di un elaboratore, a partire dalla CPU e dalla gestione della memoria. Studia il C seriamente, applicalo con esercizi guidato da un buon libro, magari di programmazione di sistema e/o di rete. Approfondisci la struttura dei device driver, dei core dei sistemi operativi (in generale), studia un kernel (quello di Linux ad esempio), confrontalo con un sistema Windows.

Impara prima le basi delle comunicazioni di rete, protocolli, tutta la pila ISO/OSI, approfondisci eventuali problematiche di sicurezza, studia l'analisi delle vulnerabilità ...

Insomma, non credere di diventare l'idolo dei tuoi amici solo per avere messo giù quattro linee di codice che fanno muovere il mouse e tentano di fare un bot che sarà rilevato quasi subito da appositi software. Non avrai imparato nulla.

Ultima modifica effettuata da nessuno il 08/08/2021 alle 17:09


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Valcars92 (Normal User)
Newbie


Messaggi: 20
Iscritto: 17/07/2021

Segnala al moderatore
Postato alle 7:46
Lunedì, 09/08/2021
hai ragione nessuno e scusami ancora se ho avuto dei comportamenti errati o poco piacevoli....grazie dei consigli e graize per avermi fatto ragionare :)

PM Quote