Загрузка данных


#NoEnv
#SingleInstance Force

#Include %A_ScriptDir%\Gdip_All.ahk


F3::

    ; ========================================================
    ; НАСТРОЙКИ ОБЛАСТИ
    ; ========================================================

    X := 0
    Y := 0

    Width := 500
    Height := 500


    ; ========================================================
    ; ЗАПУСК GDI+
    ; ========================================================

    pToken := Gdip_Startup()

    if (!pToken)
    {
        MsgBox, 16, Ошибка, GDI+ не запустился.
        return
    }


    ; ========================================================
    ; ПОЛУЧАЕМ DC ЭКРАНА
    ; ========================================================

    hdcScreen := DllCall("GetDC", "UInt", 0)

    if (!hdcScreen)
    {
        Gdip_Shutdown(pToken)

        MsgBox, 16, Ошибка, Не удалось получить DC экрана.
        return
    }


    ; ========================================================
    ; СОЗДАЁМ ПАМЯТЬ ДЛЯ СКРИНШОТА
    ; ========================================================

    hdcMem := DllCall("gdi32\CreateCompatibleDC", "UInt", hdcScreen)

    if (!hdcMem)
    {
        DllCall("ReleaseDC", "UInt", 0, "UInt", hdcScreen)
        Gdip_Shutdown(pToken)

        MsgBox, 16, Ошибка, Не удалось создать Memory DC.
        return
    }


    ; ========================================================
    ; СОЗДАЁМ BITMAP
    ; ========================================================

    hBitmap := DllCall("gdi32\CreateCompatibleBitmap", "UInt", hdcScreen, "Int", Width, "Int", Height)

    if (!hBitmap)
    {
        DllCall("gdi32\DeleteDC", "UInt", hdcMem)
        DllCall("ReleaseDC", "UInt", 0, "UInt", hdcScreen)
        Gdip_Shutdown(pToken)

        MsgBox, 16, Ошибка, Не удалось создать Bitmap.
        return
    }


    ; ========================================================
    ; ПОМЕЩАЕМ BITMAP В ПАМЯТЬ
    ; ========================================================

    hOld := DllCall("gdi32\SelectObject", "UInt", hdcMem, "UInt", hBitmap)


    ; ========================================================
    ; КОПИРУЕМ ЭКРАН
    ; ========================================================

    Result := DllCall("gdi32\BitBlt", "UInt", hdcMem, "Int", 0, "Int", 0, "Int", Width, "Int", Height, "UInt", hdcScreen, "Int", X, "Int", Y, "UInt", 0x00CC0020)


    if (!Result)
    {
        ErrorCode := DllCall("GetLastError")

        DllCall("gdi32\SelectObject", "UInt", hdcMem, "UInt", hOld)
        DllCall("gdi32\DeleteObject", "UInt", hBitmap)
        DllCall("gdi32\DeleteDC", "UInt", hdcMem)
        DllCall("ReleaseDC", "UInt", 0, "UInt", hdcScreen)

        Gdip_Shutdown(pToken)

        MsgBox, 16, Ошибка, BitBlt не смог сделать скриншот.`nКод: %ErrorCode%
        return
    }


    ; ========================================================
    ; ОСВОБОЖДАЕМ DC
    ; ========================================================

    DllCall("gdi32\SelectObject", "UInt", hdcMem, "UInt", hOld)

    DllCall("gdi32\DeleteDC", "UInt", hdcMem)

    DllCall("ReleaseDC", "UInt", 0, "UInt", hdcScreen)


    ; ========================================================
    ; ПРЕВРАЩАЕМ WINDOWS BITMAP В GDI+ BITMAP
    ; ========================================================

    pBitmap := Gdip_CreateBitmapFromHBITMAP(hBitmap)


    ; После преобразования hBitmap больше не нужен
    DllCall("gdi32\DeleteObject", "UInt", hBitmap)


    if (!pBitmap)
    {
        Gdip_Shutdown(pToken)

        MsgBox, 16, Ошибка, Не удалось преобразовать Bitmap в GDI+ Bitmap.
        return
    }


    ; ========================================================
    ; СОХРАНЯЕМ PNG
    ; ========================================================

    FilePath := A_ScriptDir "\TEST_SCREEN.png"

    SaveResult := Gdip_SaveBitmapToFile(pBitmap, FilePath)


    ; ========================================================
    ; ОСВОБОЖДАЕМ GDI+
    ; ========================================================

    Gdip_DisposeImage(pBitmap)

    Gdip_Shutdown(pToken)


    ; ========================================================
    ; ПРОВЕРЯЕМ СОХРАНЕНИЕ
    ; ========================================================

    if (SaveResult != 0)
    {
        MsgBox, 16, Ошибка, GDI+ получил изображение, но не смог сохранить PNG.`nКод: %SaveResult%
        return
    }


    if (!FileExist(FilePath))
    {
        MsgBox, 16, Ошибка, PNG-файл не найден после сохранения.
        return
    }


    ; ========================================================
    ; УСПЕХ
    ; ========================================================

    MsgBox, 64, УСПЕХ!,`nСкриншот успешно создан!`n`nФайл:`n%FilePath%

return