Screenshot vom Desktop machen auch wenn Fenster Überdeckt
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Tsuyo.
-
-
Schau mal ob du das anwenden kannst
[VB.NET] Screenshot von verdecken Programm (via Programmhandler)
wenn als Handler den explore.exe Prozess angibst. -
Hi, ich habs mit Explorer versucht.
Jedoch wird mir dann ein Ordner gezeigt und kein Desktop.
Falls kein ordner auf ist, gibts 'nen crash.
Liegt's vieleicht an Windows 7?
/Edit:
Nun wird mir nur die Taskleiste gezeigt. Warum auch immer.
/reedit:
Ich hab mir mal alle Prozesse auflisten lassen und dann jedesmal ein screen abrufen lassen.
Kein Prozess bringt mir den Desktop
/rereedit:
Es würde auch schon was bringen alles hinter einem Fenster zu screenshotten.
Ich möchte wissen was hinter meinem Firefox passiert. Egal ob dahinter ein programm etc läuftDieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Tsuyo“ ()
-
-
Nene, ich möchte einfach nur ein Screenshot machen. Dieser soll alles anzeigen was hinter dem Firefox ist.
Was mir auch Helfen würde wäre einfach nur die Position und das Iconbild der Icons auf dem Desktop herauszufinden.
Dann könnte man einfach mit GDI arbeiten.
Ich hab diesen Post hier gefunden:
social.msdn.microsoft.com/Foru…0f-4b62-80c9-7768756456e6
Und da macht selbst der C# VB converter schlappDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tsuyo“ ()
-
-
Nun, ich hab mir den Code mal in C# angesehen. Bin ja nicht auf den kopf gefallen.^^
Jedoch bietet es mir nur den namen. Nicht die Position, geschweige denn das Icon des Icon's.
/Edit:
Ich werd nochmal alles per Hand auf Vb übersetzen, mal sehn was dabei rauskommt.
grüßeDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tsuyo“ ()
-
Da stand doch was das die System Icons aus der shell32.dll holen kannst und die Icons eines Programms aus der Exe extrahieren kannst, meine ich gelesen zu haben als ichs ma schnell überflogen habe.
Die Positionen müsste man aber auch irgendwie bekommen, kann das sein das die sogar in der Registry stehen?
Also ich habe aufjedenfall so ein Programm was sich Icon Saver nennt, das speichert die Positionen der Icons und wenn man mal so nen Spiel oder Programm ausführt welches die Auflösung ändert und somit alle Icons wirr durcheinander würfelt kann man mit dem Icon Saver die Icons über Restore an ihre urspürngliche Position zurücksetzten.
Also prinzipiell muss sowas möglich sein. -
Hi, also ich habs jetzt komplett in Vb Übersetzt:
Spoiler anzeigen
VB.NET-Quellcode
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ListBox1.Items.Clear()
- Dim vhandle As IntPtr = FindWindow("Progman", "Program Manager")
- vhandle = FindWindowEx(vhandle, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
- vhandle = FindWindowEx(vhandle, IntPtr.Zero, "SysListView32", "FolderView")
- ' Find correct Windows
- Dim iconcount As Integer = SendMessage(vhandle, LVM_GETITEMCOUNT, 0, 0) 'Get all Icons
- Button1.Text = iconcount.ToString
- ' -----
- Dim vprocessid As UInteger = 0
- GetWindowThreadProcessId(vhandle, vprocessid)
- Dim vProcess As IntPtr = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, vprocessid)
- Dim vPointer As IntPtr = VirtualAllocEx(vProcess, IntPtr.Zero, 4096, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
- Try
- For i As Integer = 0 To iconcount - 1
- Dim Buffer As Byte() = New Byte(255) {}
- Dim vItem As LVITEM() = New LVITEM(0) {}
- vItem(0).mask = LVIF_TEXT
- vItem(0).iItem = i
- vItem(0).iSubItem = 0
- vItem(0).cchTextMax = Buffer.Length
- vItem(0).pszText = CType(CInt(vPointer) + Marshal.SizeOf(GetType(LVITEM)), IntPtr)
- Dim vbytesread As UInteger = 0
- WriteProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(GetType(LVITEM)), vbytesread)
- SendMessage(vhandle, LVM_GETITEMW, i, vPointer.ToInt32)
- ReadProcessMemory(vProcess, CType(CInt(vPointer) + Marshal.SizeOf(GetType(LVITEM)), IntPtr) _
- , Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Buffer.Length, vbytesread)
- Dim vText As String = Encoding.Unicode.GetString(Buffer, 0, CInt(vbytesread))
- Dim iconname As String = vText
- SendMessage(vhandle, LVM_GETITEMPOSITION, i, vPointer.ToInt32())
- Dim vpoint As Point() = New Point(1) {}
- ReadProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vpoint, 0), Marshal.SizeOf(GetType(LVITEM)), vbytesread)
- Dim iconlocy As Integer = vpoint(0).Y
- Dim iconlocx As Integer = vpoint(0).X
- ListBox1.Items.Add(iconname + " " + iconlocx.ToString + " " + iconlocy.ToString)
- Next
- Catch ex As Exception
- Finally
- VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE)
- CloseHandle(vProcess)
- End Try
- End Sub
Die Functionen und Constanten hab ich mal nicht mit reingefügt. Ist ja nur zur veranschaulichung da.
Das mit dem Extrahieren ha ich gelesen, jedoch dachte ich das man das direkt mit dem code machen könnte, was wohl nicht zutrifft.
Anyway. Ich versuch jetzt mal die Positionen herauszufinden.
Grüße -
Was den hiermit
VB.NET-Quellcode
- SendMessage(vhandle, LVM_GETITEMPOSITION, i, vPointer.ToInt32())
- Dim vpoint As Point() = New Point(1) {}
- ReadProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vpoint, 0), Marshal.SizeOf(GetType(LVITEM)), vbytesread)
- Dim iconlocy As Integer = vpoint(0).Y
- Dim iconlocx As Integer = vpoint(0).X
Da wird doch die Position ausgelesen oder etwa nicht? Bzw. ist die Variable Leer? -
Nun ich habe es Fixen können.
VB.NET-Quellcode
- Dim vText As String = Encoding.Unicode.GetString(Buffer, 0, CInt(vbytesread))
- SendMessage(vhandle, LVM_GETITEMPOSITION, i, vPointer.ToInt32)
- Dim vPoint As Point() = New Point(i) {}
- ReadProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vPoint, i), Marshal.SizeOf(GetType(Point)), vbytesread)
- Dim iconloc As String = vPoint(i).ToString
- Dim iconlocy As Integer = vPoint(i).Y
- Dim iconlocx As Integer = vPoint(i).X
Das Problem ist (war auch bei anderen Projekten so wo ich mit Sendmessages gearbeitet hab) das wenn ich in z.b ner listbox vText und ne andere Variable mit dranhänge, das die andere Variable nicht angezeigt wird.
Anderes Beispiel, ich nutze die Variable als Pfad. Dann wird mir gesagt das das kein richtiger Pfad ist. Wenn ich aber einer Textbox diese Variable als Text zuweise, eine zweite Variable erstelle die gleich der Textbox ist.
Funktionierts.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tsuyo“ ()
-
Da ich momentan viel mit API mache bin ich nun doch darauf gestoßen wie du ein Screenshot NUR vom Destktop machen kannst, im prinzip war meine Idee mit PrintWindow schon richtig nur das Handle nicht, ich habe mal hier für dich einen Code
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function PrintWindow(ByVal hwnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As UInteger) As Boolean
- End Function
- <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function GetWindowRect(ByVal hwnd As IntPtr, ByRef rc As RECT) As Integer
- End Function
- <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function FindWindowEx(ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
- End Function
- Public Class Screenshot
- Public Shared Function FromDesktop() As Bitmap
- Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", Nothing)
- Dim rc As RECT
- GetWindowRect(hwnd, rc)
- Dim bm As New Bitmap(rc.Right - rc.Left, rc.Bottom - rc.Top)
- Dim g As Graphics = Graphics.FromImage(bm)
- Dim hdc As IntPtr = g.GetHdc()
- PrintWindow(hwnd, hdc, 0)
- g.ReleaseHdc(hdc)
- g.Flush()
- g.Dispose()
- Return bm
- End Function
- <StructLayout(LayoutKind.Sequential)> _
- Public Structure RECT
- Public Left As Integer
- Public Top As Integer
- Public Right As Integer
- Public Bottom As Integer
- End Structure
- End Class
Edit: Ich hatte die RECT Structure vergessen gehabt.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()
-
-
-
-
-
-
-
Selbst dann. Was ich erreichen möchte, ist ein DirectX Handle zu bekommen. Video oder InGame.
Dann möchte ich die Farbe ausrechnen die am meißten genutzt wird, und dann die Farbe meiner Tastatur ändern. Aber da geht mein Programm schon fast in die Hose.
Nicht wegen dem ausrechnen, das alleinige in den Speicher kopieren dauert fast ne Halbe Sec. Dann kommt noch das ausrechnen dazu usw. -
-
Ähnliche Themen
-
2 Benutzer haben hier geschrieben
- Gast (20)
- jvbsl (5)