我在Windows 7下的python 2.7.11中使用了一个非常简单的代码。
def takeScreenshot(filename,directories,allConfigs):
im = pyautogui.screenshot()
im.save(os.path.join(directories['picsdir'],filename))
当我使用这个功能时,它会截取整个屏幕的截图,除了我真正想要的应用程序是三星sideync。使用此代码时,它会向我显示整个屏幕,但就好像三星侧面同步窗口已在屏幕截图中消失。
但是,如果我从键盘按钮进行打印并保存到文件,它就在那里,我可以看到它。
我不明白为什么行为会有所不同。
答案 0 :(得分:1)
至于为什么会这种情况发生,最可能的原因是三星sideync使用DirectX / OpenGL / LayeredGraphics来渲染手机的屏幕图像。
这就是为什么大多数用户无法调整应用程序,因为该图形呈现实例超出了您的应用程序范围,因此无法获取显示在您显示器上的内容(尝试渲染GL图形并拥有你自己的代码中的线程更新悲伤的GL实例,你在这里得到我的观点)。
现在你的库只是以下代码的抽象:
from PIL import ImageGrab
screenshot = ImageGrab.grab()
screenshot.save('wham.png')
现在following code挂钩到Windows系统库中,它们应该存在于系统空间中,因此可以更多地访问你的分层窗口:
import win32gui
import win32ui
hwnd = win32gui.FindWindow(None, windowname)
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename)
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
答案 1 :(得分:0)
接受的答案不起作用(或可能不再起作用)。使用Windows 7和python 2.7 3.5和3.6,接受的答案不会在捕获的图像中显示sidesync GUI。由于GUI确实显示在正常的屏幕截图中,因此您只需触发一次屏幕截图,然后从剪贴板中读取图像数据即可。
from ahk import AHK
from PIL import ImageGrab
ahk=AHK()
ahk.send('!{PrintScreen}')
img = ImageGrab.grabclipboard()