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


#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
}


; ==========================================
; Получаем экран
; ==========================================

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

if (!hdcScreen)
{
    Gdip_Shutdown(pToken)
    MsgBox, 16, Ошибка, Не удалось получить DC экрана.
    return
}


; ==========================================
; Создаём Memory DC
; ==========================================

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)


; ==========================================
; Превращаем HBITMAP в GDI+ Bitmap
; ==========================================

pBitmap := Gdip_CreateBitmapFromHBITMAP(hBitmap)

DllCall("gdi32\DeleteObject", "UInt", hBitmap)


if (!pBitmap)
{
    Gdip_Shutdown(pToken)

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


; ==========================================
; Сохраняем JPG
; ==========================================

FilePath := A_ScriptDir "\TEST_SCREEN.jpg"

FileDelete, %FilePath%

SaveResult := Gdip_SaveBitmapToFile(pBitmap, FilePath, 90)


; ==========================================
; Освобождаем GDI+
; ==========================================

Gdip_DisposeImage(pBitmap)

Gdip_Shutdown(pToken)


; ==========================================
; Проверяем результат
; ==========================================

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


if (!FileExist(FilePath))
{
    MsgBox, 16, Ошибка, Файл JPG не был создан.
    return
}


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

return