Laden...

wie makro automatisierungs programm schreiben?

Erstellt von jase vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.523 Views
J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren
wie makro automatisierungs programm schreiben?

guten morgen,

ich weiß mein betreff ist nicht passend gewählt, jedoch weiß ich es nicht besser. wie kann ich zbsp:

  • die maus zum punkt X,Y bewegen
  • linken/rechten mausklick ausführen
  • screenshot vom desktop machen und dieses auswerten (Zbsp nach ner OK schaltfläche suchen)** done, siehe hier**

im endeffekt möchte ich ein programm schreiben, welches einen bestimmten ablauf automatisiert, jedoch hab ich keine ahnung wo ich da anfangen muss..

danke im vorraus für eure tipps,

jase

_
83 Beiträge seit 2007
vor 16 Jahren

Hallo jase,

  • die maus zum punkt X,Y bewegen
  • linken/rechten mausklick ausführen

Siehe Mauszeiger kontrollieren (Move, Click)

screenshot vom desktop machen

Die Screen.Copy Methode (Glaube die hies so, ansonsten Forensuche) kann dir ein bmp zurückliefern, nach Schaltflächen suchen wird wohl schwer. 🙁

mfg _ms

49.485 Beiträge seit 2005
vor 16 Jahren

Halllo _ms,

Die Screen.Copy Methode (Glaube die hies so, ...

ich denke, du meinst Graphics.CopyFromScreen

herbivore

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

vielen dank schonmal!
gibt es denn eine methode, welches sämtliche pixel einer eingelesenen BMP datei in ein zwei dimensionales array einliest?

gruß,
jase

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo jase,

nein, aber in ein eindimensionales byte-Array. Siehe Bitmap.LockBits/Scan0 + Marshal.Copy in NET 1.1: Bitmap, Graphics, Handle: Problem mit 8-bit-Pixel

herbivore

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

wieso begrenzt du das ganze denn auf 256 farben?

Graphics.CopyFromScreen krieg ich hier unter VS 2005 nicht zu gesicht, muss ich da noch was bestimmtes includen?

am schönsten wäre eine methode, die mir für jeden pixel im bild den HEX wert zurück gibt 🤔

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo jase,

wieso begrenzt du das ganze denn auf 256 farben?

weil das in dem Fall gerade die Aufgabe war. Aber der Code soll ja nur als Beispiel dienen. Das geht für mehr Farben analog.

Graphics.CopyFromScreen krieg ich hier unter VS 2005 nicht zu gesicht, muss ich da noch was bestimmtes includen?

vermutlich. Was du includen musst steht für jede Klasse in der :rtfm: Doku.

herbivore

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

sorry wenn ich das jetzt nochmal hochhole:

mir ist es gelungen ein screenshot des bildschirms zu machen und jeden pixel als hexwert in ein 2d array zu setzen. bei 1024*768 pixel dauert das ~2,5 sekunden dank der Fast Bitmap DLL.

vielleicht sieht ja jemand noch optimierungen für meinen code?
ich hatte zbsp dran gedacht sowas wie eine history für den n-1 pixel einzufügen, sinnvoll zbsp wenn der bildschirm viele weiße flächen hat.. hab das aber noch nicht realisiert.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Diagnostics; 


            Stopwatch sw = new Stopwatch();
            sw.Start();

            Bitmap Screenshot;
            bmp.FastBitmap FastScreenshot;
            Graphics gfx;
            Color pixelColor;
            string R,G,B;
            string[,] hexArray = new string[Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height];
            
            Screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(Screenshot);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            FastScreenshot = new bmp.FastBitmap(Screenshot);

            for (int i = 0; i < Screen.PrimaryScreen.Bounds.Width; i++)
            {
                for (int j = 0; j < Screen.PrimaryScreen.Bounds.Height; j++)
                {
                    //pixel detection
                    pixelColor = FastScreenshot.GetPixel(i, j);
                    
                    //rgb -> hex konvertierung
                    R = pixelColor.R.ToString("x");
                    G = pixelColor.G.ToString("x");
                    B = pixelColor.B.ToString("x");
                    
                    //bei zahlen unter 16 ist zbsp 10 = A und nicht 0A, daher 0 drankleben
                    if (R.Length == 1)
                        R = "0" + R;
                    if (G.Length == 1)
                        G = "0" + G;
                    if (B.Length == 1)
                        B = "0" + B;
                      
                    hexArray[i,j] = R + G + B;
                }
            }

            sw.Stop();
            MessageBox.Show("Das Einlesen von " + (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height)
                            + " Pixeln hat " + sw.ElapsedMilliseconds + "ms gedauert. Das sind " +
                            (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height / sw.ElapsedMilliseconds)
                            + " Pixel/ms."); 

danke im vorraus,
jase

A
266 Beiträge seit 2007
vor 16 Jahren

Versuchs damit

und zum Buttons finden vielleicht Bildsucher?

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

mh, dann bekomme ich aber logischerweise bei


gfx = Graphics.FromImage(Screenshot);

Error 1 The best overloaded method match for 'System.Drawing.Graphics.FromImage(System.Drawing.Image)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'bmp.FastBitmap' to 'System.Drawing.Image'

wie löse ich das?

jase

A
266 Beiträge seit 2007
vor 16 Jahren

RoBitmap BlaKeks = new RoBitmap(Screenshot);

und dann kannst du es handhaben wie eine normale Bitmap nur schneller

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

hab ich auch getan, nur eben mit der dll. sieht dann so aus:


bmp.FastBitmap Screenshot;
[...]
Screenshot = new bmp.FastBitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);

nur mag er dann die o.g. zeile nicht...

J
jase Themenstarter:in
39 Beiträge seit 2007
vor 16 Jahren

atomrolfman,
du hattest vollkommen recht:


Screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(Screenshot);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            

            NewScreenshot = new bmp.FastBitmap(Screenshot);

so gehts - spart leider "nur" eine sekunde..

edit:
wenn ich das ganze string splitten weglass, spar ich gute 4sek.. nur sehe ich keine möglichkeit direkt den hexwert aus der getpixel geschichte zu holen.

edit2:
das ganze string geschnibbsel hätte ich mir sparen können - man kann die RGB werte direkt abrufen..
bin bei 3,5 sekunden 8)

edit3:
und nochmal was weg: 2sek.