我已经把一个应该采取一个窗口,其名称中包含特定字符串的一个截图简单的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()
该剧本让我对某些应用,如搅拌机或DOSBox中的黑色屏幕截图。
有谁知道是什么原因导致这个问题的只有一些应用程序,我怎么能解决呢?
编辑 :看来我的问题可能与这虽然我不知道我必须做些什么来解决我的问题,职务。 我还想补充一点,我也曾尝试加入CAPTUREBLT标志没有任何差别。