1 (изменено: Hydrogenium, 2013-08-15 01:46:05)

Тема: AHK: Как сделать скриншот (PrintWindow) ?

Вообщем есть такая API PrintWindow (делает скрин окна, даже если оно перекрыто другими окнами)
Мне нужно сделать подобный скрин и найти там пиксель

Подскажите как реализовать эту здачу

+ открыть спойлер

   
F11::
    myFunc()
Return

myFunc()
{   
  h := GetWin
  if h <> 0
    BitmapFromHWND(h)
}

GetWin()
{
    Win := "Калькулятор"
    
    Res := 0
    
    WinGet, id, list
    Loop, %id%
    {
        this_id := id%A_Index%
        WinGetTitle, this_title, ahk_id %this_id% 
        
        if this_title = Win
        {
            Res := this_id 
            break
        }
    }
    
    Return Res
}

BitmapFromHWND(hwnd)
{
    WinGetPos,,, Width, Height, ahk_id %hwnd%
    hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
    PrintWindow(hwnd, hdc)
    pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
    SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
    
    Return pBitmap
}

PrintWindow(hwnd, hdc, Flags=0)
{
    return DllCall("PrintWindow", "uint", hwnd, "uint", hdc, "uint", Flags)
}

Это мой код на основе http://www.autohotkey.net/~tic/Gdip.ahk

2

Re: AHK: Как сделать скриншот (PrintWindow) ?

А в каком виде ты хочешь получить скриншот? В виде bitmap, или в виде картинки в окне, или в виде файла? И как ты хочешь искать там пиксель?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Как сделать скриншот (PrintWindow) ?

teadrinker пишет:

А в каком виде ты хочешь получить скриншот? В виде bitmap, или в виде картинки в окне, или в виде файла? И как ты хочешь искать там пиксель?

в виде bitmap

4

Re: AHK: Как сделать скриншот (PrintWindow) ?

hwnd := WinExist("A")   ; указать нужный хэндл
pToken := Gdip_Startup()
MsgBox, % pBitmap := Gdip_BitmapFromHWND(hwnd)   ; адрес Bitmap

; здесь нужные действия с Bitmap
; для поиска пикселя можно воспользоваться Gdip_GetPixel(pBitmap, x, y)

Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
return


Gdip_Startup()
{
   if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("LoadLibrary", "str", "gdiplus")
   VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
   return pToken
}

Gdip_BitmapFromHWND(hwnd)
{
   WinGetPos,,, Width, Height, ahk_id %hwnd%
   hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
   PrintWindow(hwnd, hdc)
   pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
   return pBitmap
}

CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
   hdc2 := hdc ? hdc : GetDC()
   VarSetCapacity(bi, 40, 0)
   NumPut(w, bi, 4, "uint"), NumPut(h, bi, 8, "uint"), NumPut(40, bi, 0, "uint")
      , NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
   hbm := DllCall("CreateDIBSection", "ptr" , hdc2, "ptr" , &bi, "uint" , 0, "ptr*", ppvBits, "ptr" , 0, "uint" , 0, "ptr")

   if !hdc
      ReleaseDC(hdc2)
   return hbm
}

GetDC(hwnd=0)
{
   return DllCall("GetDC", "ptr", hwnd, "ptr")
}

ReleaseDC(hdc, hwnd=0)
{
   return DllCall("ReleaseDC", "ptr", hwnd, "ptr", hdc)
}

CreateCompatibleDC(hdc=0)
{
   return DllCall("CreateCompatibleDC", "ptr", hdc, "ptr")
}

SelectObject(hdc, hgdiobj)
{
   return DllCall("SelectObject", "ptr", hdc, "ptr", hgdiobj, "ptr")
}

PrintWindow(hwnd, hdc, Flags=0)
{
   return DllCall("PrintWindow", "ptr", hwnd, "ptr", hdc, "uint", Flags)
}

Gdip_CreateBitmapFromHBITMAP(hBitmap, Palette=0)
{
   DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "ptr", hBitmap, "ptr", Palette, "ptr*", pBitmap)
   return pBitmap
}

Gdip_GetPixel(pBitmap, x, y)
{
   DllCall("gdiplus\GdipBitmapGetPixel", "ptr", pBitmap, "int", x, "int", y, "uint*", ARGB)
   return ARGB
}

DeleteObject(hObject)
{
   return DllCall("DeleteObject", "ptr", hObject)
}

DeleteDC(hdc)
{
   return DllCall("DeleteDC", "ptr", hdc)
}

Gdip_DisposeImage(pBitmap)
{
   return DllCall("gdiplus\GdipDisposeImage", "ptr", pBitmap)
}

Gdip_Shutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
   if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
      DllCall("FreeLibrary", "ptr", hModule)
   return 0
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Как сделать скриншот (PrintWindow) ?

teadrinker, спасиб, я попозже разберу

6

Re: AHK: Как сделать скриншот (PrintWindow) ?

buff := Gdip_GetPixel(pBitmap, x, y)

получается типа такое

+ открыть спойлер

http://f4.s.qip.ru/AUIOPQiE.png

как его конвернтуть в типа

0xEDE0D4

7

Re: AHK: Как сделать скриншот (PrintWindow) ?

var := 4293587451
PrevFormat := A_FormatInteger
SetFormat, IntegerFast, H
MsgBox, % var
SetFormat, IntegerFast, % PrevFormat
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder