kilka prostych pytań od początkującego

0

Witam, piszę sobię właśnie aplikację ,która ma za zadanie odnaleźć na ekranie dany pixel/ pixele i przemieścić w to miejsce kursor myszy.
Wszystko działa w miarę ok jak do tej pory. Jestem bardzo początkujący jeżeli chodzi o programowanie a samą aplikację robie przy pomocy filmiku znalezionego na jewtubie.
Chciałbym jednak nieco zmienić aplikację, tak aby działała automatycznie po włączeniu oraz była zapętlona, tzn szukała pixeli cały czas i cały czas trzymała kursor w ich miejscu. Oto mój kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }



        private void frmMain_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            Bitmap bmpScreenshot= Screenshot();
            
            Point location;
            bool success=  FindBitmap(Properties.Resources.bmpLogin, bmpScreenshot, out location);
            Cursor.Position = location;
            
        }

        private Bitmap Screenshot()
        {
            Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            Graphics g = Graphics.FromImage(bmpScreenshot);
            g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
            return bmpScreenshot;
            
        } 
           
                    private Boolean FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location)

        { 
        
        for( int outerX=0; outerX< bmpHaystack.Width- bmpNeedle.Width; outerX++)
             {
             for( int outerY=0; outerY< bmpHaystack.Height- bmpNeedle.Height; outerY++)
             {
              for( int innerX=0; innerX<  bmpNeedle.Width; innerX++)
             {
             for( int innerY=0; innerY<  bmpNeedle.Height; innerY++)
             {
             Color cNeedle=bmpNeedle.GetPixel(innerX,innerY);
                 Color cHaystack= bmpHaystack.GetPixel( innerX+ outerX, innerY+outerY);

                 if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B)
                 {
                 goto notFound;
                 
                 
                 }

             }
        
              }location = new Point(outerX,outerY);
             return true;
             notFound:
                 continue;
             }
        
             }location= Point.Empty;
                        return false;
        
        }
          

        
        
        
        }

}

Za wszelkie rady serdecznie dziękuję i pozdrawiam.

0

Ja wiem jak to zrobić, ale nie powiem bo przeczuwam że robisz bota do gry.

0

@bobozord

petla while i niech wywoluje ta funkcje sprawdzajaca ciagle w petli. Mozesz zrobic jakis interwal np 50 ms.

0

zrobiłem pętlę
while (Cursor.Position != location)
i jest dobrze, jednak program zamiast ruszyć myszę w kierunku poszukiwanych pixeli ,wywala Mi kursor w lewy górny róg ekranu.
Dlaczego tak się dzieje?

0

Witam! Myszka lata w lewy górny róg z tego powodu, że zawsze jest ustawiany Point.Empty.
Wysyłam zmienioną funkcje FindBitmap().

 
private Boolean FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location)
        {

            for (int outerX = 0; outerX < bmpHaystack.Width - bmpNeedle.Width; outerX++)
            {
                for (int outerY = 0; outerY < bmpHaystack.Height - bmpNeedle.Height; outerY++)
                {
                    for (int innerX = 0; innerX < bmpNeedle.Width; innerX++)
                    {
                        for (int innerY = 0; innerY < bmpNeedle.Height; innerY++)
                        {
                            Color cNeedle = bmpNeedle.GetPixel(innerX, innerY);
                            Color cHaystack = bmpHaystack.GetPixel(innerX + outerX, innerY + outerY);

                            if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B)
                            {
                                continue;
                            }
                            else
                            {
                                location = new Point(outerX, outerY);
                                return true;
                            }
                        }
                    }
                }
            }
            location = Point.Empty;  
            return false;
        }

Unikaj używania goto tam gdzie nie jest potrzebne i usuń niepotrzebne fragmenty kodu np: metody frmMain_Load().

1 użytkowników online, w tym zalogowanych: 0, gości: 1