当前位置: 首页 > 面试题库 >

非活动窗口PrintWindow + win32gui的Python屏幕快照

王炜
2023-03-14
问题内容

经过数小时的搜寻,我设法“写下”了这个:

import win32gui
from ctypes import windll

hwnd = win32gui.FindWindow(None, 'Steam')

hdc = win32gui.GetDC(hwnd)
hdcMem = win32gui.CreateCompatibleDC(hdc)

hbitmap = win32ui.CreateBitmap()
hbitmap = win32gui.CreateCompatibleBitmap(hdcMem, 500, 500)

win32gui.SelectObject(hdcMem, hbitmap)

windll.user32.PrintWindow(hwnd, hdcMem, 0)

这是这样做的正确方法,我将如何保存图像?

提前致谢。


问题答案:

经过大量搜索并尝试了各种不同的方法,以下对我有用。

import win32gui
import win32ui
from ctypes import windll
import Image

hwnd = win32gui.FindWindow(None, 'Calculator')

# Change the line below depending on whether you want the whole window
# or just the client area. 
#left, top, right, bot = win32gui.GetClientRect(hwnd)
left, top, right, bot = win32gui.GetWindowRect(hwnd)
w = right - left
h = bot - top

hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()

saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)

saveDC.SelectObject(saveBitMap)

# Change the line below depending on whether you want the whole window
# or just the client area. 
#result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 1)
result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0)
print result

bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)

im = Image.frombuffer(
    'RGB',
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
    bmpstr, 'raw', 'BGRX', 0, 1)

win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)

if result == 1:
    #PrintWindow Succeeded
    im.save("test.png")


 类似资料:
  • 问题内容: 我正在尝试使用Linux上的python脚本拍摄当前窗口的屏幕截图。 我目前有一个脚本,可以截取整个屏幕的屏幕截图: 但是一个只想拥有选定的窗口。我知道问题出在grabWindow。但我不知道如何解决。 问题答案: 只需更换 与您要为其截屏的小部件一起使用。

  • 我有两台显示器;创建 LWJGL 窗口时: 它总是出现在我的左侧屏幕上。是否有一个参数可以设置以更改它出现在哪个屏幕上,例如:

  • 我有一些问题与GLFW的窗口创建。我希望有一个程序能够在窗口和全屏模式之间切换。要在GLFW 2.7.8中做到这一点,必须首先销毁活动窗口,然后创建一个新的窗口。我读到3.0版本支持多个窗口,但它仍在开发中。 我提供了自己的功能来处理键盘输入。使用最初的400×400窗口,程序按预期运行;它将在f或F上进入全屏,当按下转义键时退出,当按下任何其他键时都会抱怨。 但是,当进入全屏模式时,窗口对我提供

  • 我运行以下代码: 当我运行代码时,pygame窗口打开,但它是一个空白(黑色)屏幕。我还收到以下错误消息:Traceback(最近一次呼叫last): 文件"C:/用户/Draco/OneDrive/文档/编程/graphics.py",第13行,screen.blit(img(0,0))TypeError:'pyplay.Surface'对象不可调用 我试图打开的图像保存为JPG文件。图像保存在

  • 即使屏幕被锁定,如何在设备上开始活动。我尝试了下面的方法,但是不起作用。 广播接收器:

  • 我试图通过单击模式窗口中的按钮来调用方法,从而填充TableView。我希望这是可能的,但是我运气不好。已经在FXML文件中创建了TableView。每当我调用该方法时,都会收到一个空指针异常。有什么想法或建议吗?抱歉,如果我的问题格式不好,我问的问题不多。 主控制器.java main.fxml 错误:原因:java.lang.ims.MainController.get部分数据的NullPoi