1

Тема: AHK: Скриншот неактивного окна

Добрый день форумчане, видел подобные темы но так и не нашел точно ответа как получить скриншот неактивного окна и сохранить его файлом.
У меня получился примерно вот такой код, но как правильно использовать его и не знаю. Может кто-то подскажет?


WinGet, task_id, ID, GTA:SA:MP
DllCall("PrintWindow", UInt, task_id, UInt, hdc_buffer, UInt,0)

Я как понял переменная hdc_buffer будет содержать всю информацию, но что-то ничего так и не вышло у меня.

2 (изменено: slavafedora, 2018-09-16 18:39:57)

Re: AHK: Скриншот неактивного окна

http://forum.script-coding.com/viewtopic.php?id=8574
Способ точно такой же, но не в виде BitMap в виде в картинки.

3

Re: AHK: Скриншот неактивного окна

Все, получилось самостоятельно реализовать. Если кому то будет нужно отпишитесь скину.
Тема не актуальна.

4

Re: AHK: Скриншот неактивного окна

slavafedora, держите нас в курсе.

5

Re: AHK: Скриншот неактивного окна

stealzy, вот рабочий пример. Подмечу что если свернуть окно то скриншоты буду черными или будет только заголовок окна. Поэтому нужно перевести в оконный режим и сделать просто неактивным.


hwnd    := WinExist("GTA:SA:MP")
pToken  := Gdip_Startup()
pBitmap := Gdip_BitmapFromHWND(hwnd)

SaveBitmapToFile(pBitmap, "Screenshot.png") ; .jpg или другой нужный формат.

Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)

Для работы нужно иметь инклуд Gdip_All - https://github.com/Drugoy/Autohotkey-sc … ip_All.ahk

По сколько там нет функции SaveBitmapToFile, отправлю здесь.


SaveBitmapToFile(pBitmap, sOutput, Quality=75)  {
    SplitPath, sOutput,,, Extension
    if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
        return -1
    DllCall("gdiplus\GdipGetImageEncodersSize", UIntP, nCount, UIntP, nSize)
    VarSetCapacity(ci, nSize)
    DllCall("gdiplus\GdipGetImageEncoders", UInt, nCount, UInt, nSize, Ptr, &ci)
    if !(nCount && nSize)
        return -2
    Loop, % nCount  {
        sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
        if !InStr(sString, "*." Extension)
            continue
        pCodec := &ci+idx
        break
    }
    if !pCodec
        return -3
    if RegExMatch(Extension, "i)^J(PG|PEG|PE|FIF)$") && Quality != 75  {
        DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, UintP, nSize)
        VarSetCapacity(EncoderParameters, nSize, 0)
        DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, UInt, nSize, Ptr, &EncoderParameters)
        Loop, % NumGet(EncoderParameters, "UInt")  {
            elem := (24+A_PtrSize)*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
            if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)  {
                p := elem+&EncoderParameters-pad-4
                NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
                break
            }
        }
    }
    if A_IsUnicode
        pOutput := &sOutput
    else  {
        VarSetCapacity(wOutput, StrPut(sOutput, "UTF-16")*2, 0)
        StrPut(sOutput, &wOutput, "UTF-16")
        pOutput := &wOutput
    }
    E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, UInt, p ? p : 0)
    return E ? -5 : 0
}