|
You last visited: Today at 20:04
Advertisement
Screen Capture VB.NET
Discussion on Screen Capture VB.NET within the .NET Languages forum part of the Coders Den category.
07/22/2016, 17:13
|
#1
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 12
|
Screen Capture VB.NET
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ß
****** />
PS: ich hoffe mir kann jemand helfen.
|
|
|
07/22/2016, 20:47
|
#2
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
 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
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
|
#3
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 12
|
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. 
Gruß
Syo
|
|
|
07/23/2016, 09:10
|
#4
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
Quote:
Originally Posted by burnbany
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
|
#5
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 12
|
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
|
#6
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
Quote:
Originally Posted by burnbany
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  .
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
|
#7
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 12
|
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#
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms
Imports System.Windows
Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Security.Permissions
Public Class ScreenShot
Public Structure RECT
Public _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer
End Structure
Declare Function GetWindowDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
Declare Function PrintWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As UInteger) As Boolean
Declare Function GetWindowRect Lib "user32" (ByVal hWnd As HandleRef, ByRef lpRect As RECT) As Boolean
Public Function Create() As Bitmap
Return Create(Screen.PrimaryScreen.Bounds)
End Function
Public Function CreateFromHidden(windowHandle As IntPtr) As Bitmap
Dim bmpScreen As Bitmap = Nothing
Try
Dim r As Rectangle
Using windowGraphic As Graphics = Graphics.FromHdc(GetWindowDC(windowHandle))
r = Rectangle.Round(windowGraphic.VisibleClipBounds)
End Using
bmpScreen = New Bitmap(r.Width, r.Height)
Using g As Graphics = Graphics.FromImage(bmpScreen)
Dim hdc As IntPtr = g.GetHdc()
Try
PrintWindow(windowHandle, hdc, 0)
Finally
g.ReleaseHdc(hdc)
End Try
End Using
Catch
If Not IsNothing(bmpScreen) Then
bmpScreen.Dispose()
End If
End Try
Return bmpScreen
End Function
Public Function Create(screenshotArea As Rectangle) As Bitmap
Dim bmpScreen As Bitmap = Nothing
Dim g As Graphics = Nothing
Try
bmpScreen = New Bitmap(screenshotArea.Width, screenshotArea.Height, PixelFormat.Format24bppRgb)
g = Graphics.FromImage(bmpScreen)
g.CopyFromScreen(screenshotArea.Left, screenshotArea.Top, 0, 0, New Size(screenshotArea.Width, screenshotArea.Height))
Catch ex As Exception
If Not IsNothing(bmpScreen) Then
bmpScreen.Dispose()
End If
Finally
If Not IsNothing(g) Then
g.Dispose()
End If
End Try
Return bmpScreen
End Function
Public Function Create(windowHandle As IntPtr) As Bitmap
Dim window As Rectangle
GetWindowRect(New HandleRef(GetObject(windowHandle), windowHandle), RectangleToRECT(window))
Dim winWidth As Integer = window.Right - window.Left
Dim winHeight As Integer = window.Bottom - window.Top
Dim windowRect As Rectangle = New Rectangle(window.Left, window.Top, winWidth, winHeight)
Dim bmpScreen As Bitmap = Create(windowRect)
Return bmpScreen
End Function
Public Function CreateRelativeToControl(ctrl As Control, screenshotArea As Rectangle) As Bitmap
Dim leftTopP As Point = ctrl.PointToScreen(New Point(screenshotArea.Left, screenshotArea.Top))
Dim r As Rectangle = New Rectangle(leftTopP.X + 1, leftTopP.Y + 1, screenshotArea.Width - 1, screenshotArea.Height - 1)
Dim bmpScreen As Bitmap = Create(r)
Return bmpScreen
End Function
Public Function RectangleToRECT(Re As Rectangle) As RECT
Dim newRect As RECT
newRect._Right = Re.Right
newRect._Left = Re.Left
newRect._Bottom = Re.Bottom
newRect._Top = Re.Top
Return newRect
End Function
End Class
Hier wird im konstruktor getestet ob der Prozess existiert
Public Class MyProzess
Dim Name As String
Dim pro As Process
Sub New(ByVal b As String)
Name = b
If (Process.GetProcessesByName(Name).Length <= 0) Then
Throw New NoSuchelEmentException
End If
pro = Process.GetProcessesByName(Name)(0)
End Sub
Public Function Screen() As Bitmap
Dim img As New ScreenShot
Dim ret As Bitmap
ret = img.CreateFromHidden(pro.Handle)
Return ret
End Function
End Class
Public Class NoSuchelEmentException
Inherits ApplicationException
Public Sub New()
MyBase.New("Prozess konnte nicht gefunden werden.")
Application.Exit()
End Sub
End Class
Aufruf:
Dim gta As New MyProzess("gta_sa")
Dim bild As Bitmap = gta.Screen()
Form1.PictureBox3.Image = bild
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
|
#8
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
Quote:
Originally Posted by burnbany
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
|
#9
|
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
|
Quote:
Originally Posted by burnbany
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#
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms
Imports System.Windows
Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Security.Permissions
Public Class ScreenShot
Public Structure RECT
Public _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer
End Structure
Declare Function GetWindowDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
Declare Function PrintWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As UInteger) As Boolean
Declare Function GetWindowRect Lib "user32" (ByVal hWnd As HandleRef, ByRef lpRect As RECT) As Boolean
Public Function Create() As Bitmap
Return Create(Screen.PrimaryScreen.Bounds)
End Function
Public Function CreateFromHidden(windowHandle As IntPtr) As Bitmap
Dim bmpScreen As Bitmap = Nothing
Try
Dim r As Rectangle
Using windowGraphic As Graphics = Graphics.FromHdc(GetWindowDC(windowHandle))
r = Rectangle.Round(windowGraphic.VisibleClipBounds)
End Using
bmpScreen = New Bitmap(r.Width, r.Height)
Using g As Graphics = Graphics.FromImage(bmpScreen)
Dim hdc As IntPtr = g.GetHdc()
Try
PrintWindow(windowHandle, hdc, 0)
Finally
g.ReleaseHdc(hdc)
End Try
End Using
Catch
If Not IsNothing(bmpScreen) Then
bmpScreen.Dispose()
End If
End Try
Return bmpScreen
End Function
Public Function Create(screenshotArea As Rectangle) As Bitmap
Dim bmpScreen As Bitmap = Nothing
Dim g As Graphics = Nothing
Try
bmpScreen = New Bitmap(screenshotArea.Width, screenshotArea.Height, PixelFormat.Format24bppRgb)
g = Graphics.FromImage(bmpScreen)
g.CopyFromScreen(screenshotArea.Left, screenshotArea.Top, 0, 0, New Size(screenshotArea.Width, screenshotArea.Height))
Catch ex As Exception
If Not IsNothing(bmpScreen) Then
bmpScreen.Dispose()
End If
Finally
If Not IsNothing(g) Then
g.Dispose()
End If
End Try
Return bmpScreen
End Function
Public Function Create(windowHandle As IntPtr) As Bitmap
Dim window As Rectangle
GetWindowRect(New HandleRef(GetObject(windowHandle), windowHandle), RectangleToRECT(window))
Dim winWidth As Integer = window.Right - window.Left
Dim winHeight As Integer = window.Bottom - window.Top
Dim windowRect As Rectangle = New Rectangle(window.Left, window.Top, winWidth, winHeight)
Dim bmpScreen As Bitmap = Create(windowRect)
Return bmpScreen
End Function
Public Function CreateRelativeToControl(ctrl As Control, screenshotArea As Rectangle) As Bitmap
Dim leftTopP As Point = ctrl.PointToScreen(New Point(screenshotArea.Left, screenshotArea.Top))
Dim r As Rectangle = New Rectangle(leftTopP.X + 1, leftTopP.Y + 1, screenshotArea.Width - 1, screenshotArea.Height - 1)
Dim bmpScreen As Bitmap = Create(r)
Return bmpScreen
End Function
Public Function RectangleToRECT(Re As Rectangle) As RECT
Dim newRect As RECT
newRect._Right = Re.Right
newRect._Left = Re.Left
newRect._Bottom = Re.Bottom
newRect._Top = Re.Top
Return newRect
End Function
End Class
Hier wird im konstruktor getestet ob der Prozess existiert
Public Class MyProzess
Dim Name As String
Dim pro As Process
Sub New(ByVal b As String)
Name = b
If (Process.GetProcessesByName(Name).Length <= 0) Then
Throw New NoSuchelEmentException
End If
pro = Process.GetProcessesByName(Name)(0)
End Sub
Public Function Screen() As Bitmap
Dim img As New ScreenShot
Dim ret As Bitmap
ret = img.CreateFromHidden(pro.Handle)
Return ret
End Function
End Class
Public Class NoSuchelEmentException
Inherits ApplicationException
Public Sub New()
MyBase.New("Prozess konnte nicht gefunden werden.")
Application.Exit()
End Sub
End Class
Aufruf:
Dim gta As New MyProzess("gta_sa")
Dim bild As Bitmap = gta.Screen()
Form1.PictureBox3.Image = bild
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:
|
|
|
07/30/2016, 23:42
|
#10
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 12
|
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
|
|
|
 |
Similar Threads
|
Moss Screen Capture Blocker
12/15/2022 - WarRock - 4 Replies
Hy guys today i want to condivide with all this great tool that able you to use hack during ESL gaming and don't get screened by Moss.exe.
You need to downalod my Loader from http://hsr.altervista.org/web/index.php and make account if you don't alredy have.
TUTORIAL
Choose Moss Screen Blocker from stream pannel, and click to stream, when request open moss.exe.
Follow what console show.
If you want stop capture screen service you need to go to moss windows and press INS key.
A console...
|
[Release] Black Box Screen Capture
08/02/2016 - AutoIt - 3 Replies
This is me just before dying in Ark Survival Evolved:
http://i66.tinypic.com/2cwjv5l.jpg
And this is me after I found my dead body to get my stuff back quickly:
http://i67.tinypic.com/jkdd1k.jpg
I found my stuff really quickly and effortlessly, because I had this application running with the game Ark Survival Evolved.
|
Screen Capture
02/12/2013 - Coding Releases - 5 Replies
.
|
Screen Capture oder so
03/23/2008 - Technical Support - 0 Replies
Hat jemand von euch ein Programm das alle 10 Sekunden oder mehr oder weniger ein Screen macht und in einen Eingestellten Ordner speichert?
Wäre nett wenn ich einen Link bekommen könnte ;) gegoogelt hab ich schon
ps : Ich will kein Video :p
|
All times are GMT +1. The time now is 20:09.
|
|