guten morgen,
ich weiß mein betreff ist nicht passend gewählt, jedoch weiß ich es nicht besser. wie kann ich zbsp:
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
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
Halllo _ms,
Die Screen.Copy Methode (Glaube die hies so, ...
ich denke, du meinst Graphics.CopyFromScreen
herbivore
vielen dank schonmal!
gibt es denn eine methode, welches sämtliche pixel einer eingelesenen BMP datei in ein zwei dimensionales array einliest?
gruß,
jase
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
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 🤔
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
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
und zum Buttons finden vielleicht Bildsucher?
Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...
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
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...
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...
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.