Bu, PIL'in grabscreen kaynağıdır. Herhangi bir parametreyi kabul etmez ve tüm ekranı kapar ve bitmap'e dönüştürür.
PyImaging_GrabScreenWin32(PyObject* self, PyObject* args)
{
int width, height;
HBITMAP bitmap;
BITMAPCOREHEADER core;
HDC screen, screen_copy;
PyObject* buffer;
/* step 1: create a memory DC large enough to hold the
entire screen */
screen = CreateDC(";DISPLAY", NULL, NULL, NULL);
screen_copy = CreateCompatibleDC(screen);
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);
bitmap = CreateCompatibleBitmap(screen, width, height);
if (!bitmap)
goto error;
if (!SelectObject(screen_copy, bitmap))
goto error;
/* step 2: copy bits into memory DC bitmap */
if (!BitBlt(screen_copy, 0, 0, width, height, screen, 0, 0, SRCCOPY))
goto error;
/* step 3: extract bits from bitmap */
buffer = PyString_FromStringAndSize(NULL, height * ((width*3 + 3) & -4));
if (!buffer)
return NULL;
core.bcSize = sizeof(core);
core.bcWidth = width;
core.bcHeight = height;
core.bcPlanes = 1;
core.bcBitCount = 24;
if (!GetDIBits(screen_copy, bitmap, 0, height, PyString_AS_STRING(buffer),
(BITMAPINFO*) &core, DIB_RGB_COLORS))
goto error;
DeleteObject(bitmap);
DeleteDC(screen_copy);
DeleteDC(screen);
return Py_BuildValue("(ii)N", width, height, buffer);
error:
PyErr_SetString(PyExc_IOError, "screen grab failed");
DeleteDC(screen_copy);
DeleteDC(screen);
return NULL;
}
Yani, biraz derin gittiğinizde, bulunan C yaklaşım
http://msdn.microsoft.com/en-us/library/dd144909(VS.85).aspx
iyidir Ve Python ctypes var, Yani burada ctypes
>>> from ctypes import *
>>> user= windll.LoadLibrary("c:\\winnt\\system32\\user32.dll") #I am in windows 2000, may be yours will be windows
>>> h = user.GetDC(0)
>>> gdi= windll.LoadLibrary("c:\\winnt\\system32\\gdi32.dll")
>>> gdi.GetPixel(h,1023,767)
16777215 #I believe its white color of RGB or BGR value, #FFFFFF (according to msdn it should be RGB)
>>> gdi.GetPixel(h,1024,767)
-1 #because my screen is only 1024x768
kullanarak yaklaşımdır GetPixel bu gibi bir sarmalayıcı yazabilirsin
Mine Windows 2000, bu yüzden yolda
winnt
koymak, sen
windows
olarak değiştirmek gerekebilir veya tamamen kaldırmak chould:
Sonra ... getpixel(0,0)
, getpixel(100,0)
vb gibi
PS kullanabilirsiniz Sadece user32.dll
ve gdi32.dll
kullanarak yol çalışması gerekir. S.Mark çözümüne bağlı
Çok teşekkürler. Bu ekran yukarı NOTLARABLY okuyor. Hemen hemen hiç yavaşlama olmadan istediğim kadar hızlı okuyabilirim. ;) – ThantiK
Yukarıdaki sözdizimini denemeler için denedim ve LoadLibrary ile çalışamıyorum. Sarıcı işlev kodu tam olarak aradığım şey. – Octipi
Bunun gerçekten de zamanla en az 30 kez çalıştığına inanamıyorum. GetPixel'i denedim ve en fazla zaman harcadı. –