Screenshot möglichst schnell aufnehmen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Screenshot möglichst schnell aufnehmen

    Hallo.

    Und zwar wollte ich mal fragen, wie man einen Screenshot vom Desktop möglichst schnell aufnehmen kann.
    Bitmap.CopyFromScreen ist definitiv zu langsam.

    Gibts da eine API Alternative oder so?
    Hey.

    Code ist derzeit so:

    VB.NET-Quellcode

    1. <DllImport("Gdi32.dll")> Private Function BitBlt(hdc As IntPtr, nXDest As Integer, nYDest As Integer, nWidth As Integer, nHeight As Integer, hdcSrc As IntPtr, nXSrc As Integer, nYSrc As Integer, dwRop As TernaryRasterOperations) As Boolean
    2. End Function
    3. <DllImport("Gdi32.dll", SetLastError:=True)> Private Function CreateCompatibleDC(ByVal hRefDC As IntPtr) As IntPtr
    4. End Function
    5. <DllImport("Gdi32.dll")> Private Function DeleteDC(hdc As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    6. End Function
    7. <DllImport("Gdi32.dll")> Public Function SelectObject(ByVal hdc As IntPtr, ByVal hObject As IntPtr) As IntPtr
    8. End Function
    9. <DllImport("Gdi32.dll")> Private Function DeleteObject(hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    10. End Function
    11. Enum TernaryRasterOperations As UInteger
    12. ''' <summary>dest = source</summary>
    13. SRCCOPY = &HCC0020
    14. ''' <summary>dest = source OR dest</summary>
    15. SRCPAINT = &HEE0086
    16. ''' <summary>dest = source AND dest</summary>
    17. SRCAND = &H8800C6
    18. ''' <summary>dest = source XOR dest</summary>
    19. SRCINVERT = &H660046
    20. ''' <summary>dest = source AND (NOT dest)</summary>
    21. SRCERASE = &H440328
    22. ''' <summary>dest = (NOT source)</summary>
    23. NOTSRCCOPY = &H330008
    24. ''' <summary>dest = (NOT src) AND (NOT dest)</summary>
    25. NOTSRCERASE = &H1100A6
    26. ''' <summary>dest = (source AND pattern)</summary>
    27. MERGECOPY = &HC000CA
    28. ''' <summary>dest = (NOT source) OR dest</summary>
    29. MERGEPAINT = &HBB0226
    30. ''' <summary>dest = pattern</summary>
    31. PATCOPY = &HF00021
    32. ''' <summary>dest = DPSnoo</summary>
    33. PATPAINT = &HFB0A09
    34. ''' <summary>dest = pattern XOR dest</summary>
    35. PATINVERT = &H5A0049
    36. ''' <summary>dest = (NOT dest)</summary>
    37. DSTINVERT = &H550009
    38. ''' <summary>dest = BLACK</summary>
    39. BLACKNESS = &H42
    40. ''' <summary>dest = WHITE</summary>
    41. WHITENESS = &HFF0062
    42. ''' <summary>
    43. ''' Capture window as seen on screen. This includes layered windows
    44. ''' such as WPF windows with AllowsTransparency="true"
    45. ''' </summary>
    46. CAPTUREBLT = &H40000000
    47. End Enum
    48. Private Sub takescreen()
    49. Dim pTarget As IntPtr = PictureBox1.Handle
    50. Dim pSource As IntPtr = CreateCompatibleDC(pTarget)
    51. Dim pOrig As IntPtr = SelectObject(pSource, bmp.)
    52. End Sub


    Was soll ich nun bei SelectObject übergeben?
    Ist das überhaupt für Screenshots geeignet?

    Daniel Baumert schrieb:

    Bitmap.CopyFromScreen
    oder das Speichern des Bildes auf Platte?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Daniel Baumert schrieb:

    API
    Ich weiß nicht, ob bei einem CreateCompatibleDC(NULL) die offenen Fenster mit erfasst werden, das wäre interessant zu testen.
    Allerdings glaube ich schon, dass die Framework-Funktion optimal programmiert und dass also der Geschwindigkeitsverlust wenn überhaupt, dann minimal ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was wahrscheinlich schneller ist, wäre der Weg über DirectX: codeproject.com/Articles/27446…e-using-DirectX-in-Csharp (musste übrigens bisschen umschreiben - würde da anstatt SlimDX SharpDX nehmen).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.