_WinAPI_BitBlt zwischenspeichern

  • Hey
    Ich habe momentan folgendes Skript:

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}","_exit")
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #Include <GDIPlus.au3>
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("_WinAPI_BitBlt", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP,$WS_EX_TOPMOST)
    GUISetState(@SW_SHOW)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = _WinAPI_GetDesktopWindow()

    [/autoit] [autoit][/autoit] [autoit]

    $hDC_Gui = _WinAPI_GetDC($hGui)
    $hDC_Desk = _WinAPI_GetDC($hWnd)

    [/autoit] [autoit][/autoit] [autoit]

    $hDC_Graphic = _GDIPlus_GraphicsGetDC($hGraphic)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hDC_Graphic, 0, 0, @DesktopWidth, @DesktopHeight, $hDC_Desk, 0, 0, $SRCCOPY)

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_ReleaseDC($hGui, $hDC_Gui)
    _WinAPI_ReleaseDC($hWnd, $hDC_Desk)
    Func _exit()
    Exit
    EndFunc

    [/autoit]


    Jetzt möchte ich gerne den _WinAPI_BitBlt aber vorher ausführen, damit ich ein "Screenshot" ohne mein Fenster habe. Das Fenster ist nur zur Ausgabe danach zuständig. Wenn ich den Befehl vor dem Show mache, funktioniert es nicht. Wie kann ich jetzt die Bits zwischenspeichern und danach erst mein Fenster sichtbar machen und dann die Bits auf das Fenster blitten?

    Danke für Antworten
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von AntiSpeed (26. Januar 2011 um 18:10)

  • Hier der Code aus Windows Screenshooter:

    Spoiler anzeigen
    [autoit]


    HotKeySet("{ESC}","_exit")
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #Include <GDIPlus.au3>
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $x = 0
    $y = 0
    $width = @DesktopWidth
    $height = @DesktopHeight
    $hBitmap = Grab_Region($x, $y, $width, $height)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("_WinAPI_BitBlt", $width, $height, $x, $y, $WS_POPUP,$WS_EX_TOPMOST)
    GUISetState(@SW_SHOW)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $width, $height)

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Grab_Region($x, $y, $w, $h)
    Local $hDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $memBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $w, $h)
    Local $hObj = _WinAPI_SelectObject($hMemDC, $memBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $w, $h, $hDC, $x, $y, $SRCCOPY)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aCursor = _WinAPI_GetCursorInfo()
    If $aCursor[1] Then
    Local $hIcon = _WinAPI_CopyIcon($aCursor[2])
    Local $aIcon = _WinAPI_GetIconInfo($hIcon)
    _WinAPI_DeleteObject($aIcon[4])
    _WinAPI_DrawIcon($hMemDC, $aCursor[3] - $aIcon[2], $aCursor[4] - $aIcon[3], $hIcon)
    _WinAPI_DestroyIcon($hIcon)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $hBmp = _GDIPlus_BitmapCreateFromHBITMAP($memBitmap)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_DeleteObject($memBitmap)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_DeleteDC($hDC)
    Return SetError(0, 0, $hBmp)
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (25. Januar 2011 um 20:21)

  • Vielen Dank für den Code!

    Nur eine Frage hätte ich noch: Kann ich auch den Cursor noch mitspeichern? (oder muss ich Position und Grafik manuell auslesen?)
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug