Skip to content

Instantly share code, notes, and snippets.

@silverjam
Created February 3, 2010 17:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save silverjam/293787 to your computer and use it in GitHub Desktop.
Save silverjam/293787 to your computer and use it in GitHub Desktop.
from struct import *
from ctypes import *
from win32con import *
from win32clipboard import *
from win32api import *
from ctypes import create_string_buffer as bytes
gdip = windll.gdiplus
kernel32 = windll.kernel32
jpegFmtGuid = pack("IHHBBBBBBBB", 0xb96b3cae, 0x0728, 0x11d3, 0x9d,
0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e)
token = c_uint32()
assert 0 == (
gdip.GdiplusStartup(
pointer(token), bytes(pack("I", 1), 32), bytes(32)))
try:
pbmp = c_void_p()
keybd_event(VK_SNAPSHOT, 0, 0, 0)
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
try:
OpenClipboard()
data = GetClipboardData(CF_DIB)
finally:
CloseClipboard()
header, bmpdata = bytes(data[:52]), bytes(data[52:])
assert 0 == (
gdip.GdipCreateBitmapFromGdiDib(
header, bmpdata, pointer(pbmp)))
count, size = c_uint32(), c_uint32()
gdip.GdipGetImageEncodersSize(pointer(count), pointer(size))
encoders = bytes(size.value)
gdip.GdipGetImageEncoders(count, size, encoders)
i = encoders.raw.find(jpegFmtGuid)
jpegEncoderClsid = encoders[i-16:i]
assert 0 == (
gdip.GdipSaveImageToFile(
pbmp, c_wchar_p("c:/temp/screenshot.jpg"),
jpegEncoderClsid, 0))
finally:
kernel32.LocalFree(pbmp)
gdip.GdiplusShutdown(token)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment