Загрузка данных
#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