【发布时间】:2013-12-16 00:45:48
【问题描述】:
我已经编写了一个简单的 python 脚本,它可以截取名称包含特定字符串的窗口的屏幕截图。我使用的代码如下,
import win32gui, win32ui, win32con
import PIL.Image
def getWindowHandle(name):
windowList = []
win32gui.EnumWindows(lambda hwnd, wndList:
wndList.append((win32gui.GetWindowText(hwnd), hwnd)),
windowList)
for pair in windowList:
if name in pair[0]:
return pair[1]
return None
class Window():
def __init__(self, hwnd = None):
if not hwnd: return
l, t, r, b = win32gui.GetClientRect(hwnd)
sl, st, _, _ = win32gui.GetWindowRect(hwnd)
cl, ct = win32gui.ClientToScreen(hwnd, (l, t))
self.size = (r - l, b - t)
self.position = (cl - sl, ct - st)
hDC = win32gui.GetWindowDC(hwnd)
self.windowDC = win32ui.CreateDCFromHandle(hDC)
self.newDC = self.windowDC.CreateCompatibleDC()
#win32gui.ReleaseDC(hwnd, hDC)
self.bitmap = win32ui.CreateBitmap()
self.bitmap.CreateCompatibleBitmap(self.windowDC, self.size[0], self.size[1])
self.newDC.SelectObject(self.bitmap)
def __del__(self):
self.newDC.DeleteDC()
self.windowDC.DeleteDC()
del self.bitmap
def screenshot(self, location = 'C:\\Users\\Grieverheart\\Desktop\\'):
self.newDC.BitBlt((0, 0), self.size, self.windowDC, self.position, win32con.SRCCOPY)
self.bitmap.Paint(self.newDC)
bmpinfo = self.bitmap.GetInfo()
bmpstr = self.bitmap.GetBitmapBits(True)
im = PIL.Image.frombuffer('RGB', self.size, bmpstr, 'raw', 'BGRX', 0, 1)
try:
im.save(location + 'test.png', 'PNG')
except IOError:
return
def main():
handle = getWindowHandle("Blender")
if not handle: return
window = Window(handle)
window.screenshot()
if __name__ == "__main__":
main()
脚本为我提供了一些应用程序的黑色屏幕截图,例如 Blender 或 DOSBox。
有谁知道仅在某些应用程序中导致此问题的原因以及我该如何解决?
编辑:看来我的问题可能与this 帖子有关,尽管我不确定我必须做些什么来解决我的问题。我还想补充一点,我也尝试过添加 CAPTUREBLT 标志,没有任何区别。
【问题讨论】:
-
尝试添加 CAPTUREBLT 标志。
-
您使用的是启用 Aero 的 Windows Vista/7 吗?
标签: python windows winapi screenshot pywin32