Screen Capture VB.NET

07/22/2016 17:13 burnbany#1
Hallo,
ich habe vor einen BOT zu schreiben. Dieser soll in minimierter Form funktionieren. Das bedeutet das Spiel ist minimiert und ich kann den PC für andere Sachen verwenden wärend der BOT im hintergrund läuft. Ich möchte auf optische ereignisse reagieren. Hierzu benötige ich allerdeings einen Stream von dem Spiel. Bedeutet, ich möchte einen screenshot von dem Spiel wärend es minimiert ist. Eine möglichkeit wäre die einbindung des Prozesses als Kindprozess(in einer art sandbox mode). Jedoch habe ich mich dafür entschießen, um auch mögliche Antihackshields zu umgehen, den Prozess nur zu überwachen.
Der folgene Teilcode existiert bis jetzt:
(an der stelle PSEUDOCODE soll nun die entsprechende funktion rein)

Code:
Public Class Porzess
    Dim Name As String
    Dim Exist As Boolean

    Sub New(ByVal b As String)
        Name = b
        If (System.Diagnostics.Process.GetProcessesByName(Name).Length <= 0) Then
            Throw New NoSuchelEmentException
        End If
    End Sub


    Public Function Screen() As Image
        Dim img As Image
        'PSEUDOCODE 
        'img = capturePIC(Name)     <-  Name = Name des prozessen (wird im konstruktor überprüft)
        Return img
    End Function
End Class

Public Class NoSuchelEmentException
    Inherits ApplicationException
    Public Sub New()
        MyBase.New("Der Prozess existiert nicht")
    End Sub
End Class
Die Funktion soll mir wie oben erwähnt, einen aktuellen screenshot von dem spiel liefern. Diesen werde ich dann auslesen um auf Ereignisse zu reagieren.

Ich hoffe mir kann jemand helfen. Ich weis das es schwer ist, aber denn noch möglich, da Windows ebenfalls eine vorschau von einem minimierten Prozess machen kann.

Gruß

Syo

PS: ich hoffe mir kann jemand helfen.
07/22/2016 20:47 YatoDev#2
[Only registered and activated users can see links. Click Here To Register...] gl hf

diesen logikfehler solltest du nicht beibehalten:
Code:
Process.GetProcessesByName(Name).Length <= 0
und ein minimiertes fenster zeichnet sich nicht neu bzw der grafik treiber aktualisiert das bild auch nicht. da musst du dir was anderes einfallen lassen

Quote:
Originally Posted by burnbany View Post
Windows ebenfalls eine vorschau von einem minimierten Prozess machen kann.
wenn du komplett auf gute performance verzichten willst, mach es so
07/22/2016 21:07 burnbany#3
Danke für den Link der ist sehr hilfreich! :)

Ebenfalls ergibt es Sinn was du über das Performance sagst. Danke dir!

Code:
public static Bitmap CreateFromHidden(IntPtr windowHandle)
		{
			Bitmap bmpScreen = null;
			try
			{
				Rectangle r;
				using(Graphics windowGraphic = Graphics.FromHdc(User32.GetWindowDC(windowHandle)))
				{
					r = Rectangle.Round(windowGraphic.VisibleClipBounds);
				}

				bmpScreen = new Bitmap(r.Width, r.Height);
				using(Graphics g = Graphics.FromImage(bmpScreen))
				{
					IntPtr hdc = g.GetHdc();
					try
					{
						User32.PrintWindow(windowHandle, hdc, 0);
					}
					finally
					{
						g.ReleaseHdc(hdc);
					}
				}
			}
			catch
			{
				if(bmpScreen != null)
				{
					bmpScreen.Dispose();
				}
			}

			return bmpScreen;
}
Das ist genau das was ich gesucht habe. :handsdown:
Gruß

Syo
07/23/2016 09:10 YatoDev#4
Quote:
Originally Posted by burnbany View Post
Ebenfalls ergibt es Sinn was du über das Performance sagst. Danke dir!
hatte es immer so gemacht das ich das ziel fenster aus dem sichtbaren bereich des desktops rausschiebe. ist ein bisschen tricky mit mehreren bildschirmen.

und du musst noch schauen das bei mouse clicks in das fenster nicht der fokus auf den desktop verloren geht
07/29/2016 20:24 burnbany#5
Ich habe etwas Zeit gehabt und den Code umgeschrieben für vb.net. Der Code scheint zu funktionieren und ich kann über ein Handle auf den Prozess zugreifen und ein Bild davon machen. Das Problem was ich momentan habe ist das es sich um einen Safehandle zu handel scheint: Microsoft.Win32.SafeHandles.SafeProcessHandle OpenProcess(Int32, Int32, Boolean).

Meine weitere Frage wäre, kann man das irgendwie austricksen bzw umgehen und ignorieren das der Porzess gesichert ist?

Wie gesagt es handelt sich um einen Bot.
07/29/2016 23:34 YatoDev#6
Quote:
Originally Posted by burnbany View Post
Microsoft.Win32.SafeHandles.SafeProcessHandle OpenProcess(Int32, Int32, Boolean).

Meine weitere Frage wäre, kann man das irgendwie austricksen bzw umgehen und ignorieren das der Porzess gesichert ist?
Bist du dir sicher das du OpenProcess benutzen möchtest?

Um einen screenshot zu machen brauchst du das fenster handle.

das bekommst du durch FindWindow (Google: FindWindow msdn), Process.GetProcessesByName("name ohne .exe").FirstOrDefault().MainWindowHandle oder auch durch [Only registered and activated users can see links. Click Here To Register...].

SafeHandle ist kein gesichertes Handle sondern ein Handle welches man nicht selber schließen muss (für einen screenshot unnötig).

Du solltest mit IntPtr arbeiten.

OpenProcess benutzt man zb in game hacks wo man speicher ausliest
07/30/2016 15:39 burnbany#7
Das hört sich sehr nach meinem code an... Ich zeige einfach mal hier den Code


Das ist der code aus Github den ich umgeschrieben habe auf VB.NET dieser war vorher in C#

Hier wird im konstruktor getestet ob der Prozess existiert

Aufruf:

Also man deklariert einen neuen Prozess. Dann fragt man von diesem ab Prozess.screen und bekommt das bild von MyProzess.screen geliefert im Bitmap format. Diese funktion benutzt die Klasse Screenshot um das Bild vom Prozess zu machen. Das Problem ist das zb "mspaint" funktioniert aber bei GTA meckert er weil der Windowshandle irgendwie geschützt ist. Und dass muss ich irgendwie umgehen

Edit: Sorry, ich sehe grade der Code sieht grauenhaft aus. Irgendwie fehlen hier die einrückungen und einfärbungen.
07/30/2016 22:22 YatoDev#8
Quote:
Originally Posted by burnbany View Post
Edit: Sorry, ich sehe grade der Code sieht grauenhaft aus. Irgendwie fehlen hier die einrückungen und einfärbungen.
nimms mir nicht übel aber so werde ich den code nicht durchlesen. außerdem hasse ich die basic syntax.

liegt es vielleicht daran das gta im vollbildmodus ist? das geht nur im fenstermodus
07/30/2016 23:22 .Scy#9
Quote:
Originally Posted by burnbany View Post
Das hört sich sehr nach meinem code an... Ich zeige einfach mal hier den Code


Das ist der code aus Github den ich umgeschrieben habe auf VB.NET dieser war vorher in C#

Hier wird im konstruktor getestet ob der Prozess existiert

Aufruf:

Also man deklariert einen neuen Prozess. Dann fragt man von diesem ab Prozess.screen und bekommt das bild von MyProzess.screen geliefert im Bitmap format. Diese funktion benutzt die Klasse Screenshot um das Bild vom Prozess zu machen. Das Problem ist das zb "mspaint" funktioniert aber bei GTA meckert er weil der Windowshandle irgendwie geschützt ist. Und dass muss ich irgendwie umgehen

Edit: Sorry, ich sehe grade der Code sieht grauenhaft aus. Irgendwie fehlen hier die einrückungen und einfärbungen.

es gibt auch tags für code.
Quote:
[code][ /code]
07/30/2016 23:42 burnbany#10
Quote:
liegt es vielleicht daran das gta im vollbildmodus ist? das geht nur im fenstermodus
Oh Ja xD
Du hast recht. danke^^

Ne war leider doch nicht die Lösung.. trotz Fenstermodus meckert er