Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RTL窗口上的PrintWindow会生成带有PW_RENDERFULLCONTENT标志的镜像图像_Python_Winapi_Gdi_Pywin32 - Fatal编程技术网

Python RTL窗口上的PrintWindow会生成带有PW_RENDERFULLCONTENT标志的镜像图像

Python RTL窗口上的PrintWindow会生成带有PW_RENDERFULLCONTENT标志的镜像图像,python,winapi,gdi,pywin32,Python,Winapi,Gdi,Pywin32,我正在尝试使用pywin32使用以下python代码获取RTL窗口的图像: def get_window_image(hwnd:int,window_region:region)->np.ndarray: PW_RENDERFULLCONTENT=2 dc_句柄=无 dc_obj=无 保存位图=无 内存\u dc\u对象=无 尝试: #正在创建用于检索屏幕截图的设备上下文。基于以下几点: # https://stackoverflow.com/questions/19695214/python-

我正在尝试使用pywin32使用以下python代码获取RTL窗口的图像:

def get_window_image(hwnd:int,window_region:region)->np.ndarray:
PW_RENDERFULLCONTENT=2
dc_句柄=无
dc_obj=无
保存位图=无
内存\u dc\u对象=无
尝试:
#正在创建用于检索屏幕截图的设备上下文。基于以下几点:
# https://stackoverflow.com/questions/19695214/python-screenshot-of-inactive-window-printwindow-win32gui
#有关设备上下文的文档:
# https://docs.microsoft.com/en-us/cpp/mfc/device-contexts?view=vs-2019
dc_handle=win32gui.GetWindowDC(hwnd)
dc_obj=win32ui.CreateDCFromHandle(dc_句柄)
memory_dc_obj=dc_obj.CreateCompatibleDC()
#从设备上下文创建位图
save_bitmap=win32ui.CreateBitmap()
保存位图。创建兼容位图(dc\U对象,窗口区域。获取宽度(),窗口区域。获取高度()
内存对象。选择对象(保存位图)
如果sys.getwindowsversion().major>=8:
render_flags=PW_RENDERFULLCONTENT
其他:
render_标志=0
#拍摄窗口的截图
windell.user32.PrintWindow(hwnd,memory_dc_obj.GetSafeHdc(),render_标志)
#从截图中检索位图内容
bmp\u info=save\u bitmap.GetInfo()
bmp\u str=save\u bitmap.GetBitmapBits(真)
bmp_高度,bmp_宽度=bmp_信息['bmHeight',bmp_信息['bmWidth']
window\u image=np.fromstring(string=bmp\u str,dtype=np.uint8)
window\u image=window\u image.重塑((bmp\u高度,bmp\u宽度,4))
窗口图像[:,:,3]=255#删除alpha通道
返回窗口图像
最后:
如果“保存位图”不是“无”:
win32gui.DeleteObject(保存位图.GetHandle())
如果内存_dc_obj不是无:
内存\u dc\u对象删除dc()
如果dc_obj不是无:
dc_obj.DeleteDC()
如果dc_句柄不是无:
win32gui.ReleaseDC(hwnd,dc\u句柄)
生成RTL窗口的代码:

win32gui.MessageBox(无,'win32con.MB'RTLREADING,'win32con.MB'
我正在传递
PrintWindow
标志-
PW_RENDERFULLCONTENT=2
,这将有助于使用正确的帧而不是经典帧渲染窗口(另请参见)

我有两台规格相同的电脑。在第一台电脑上,图像以镜像方式打印,在第二台电脑上,图像以原始显示方式打印

两台电脑的windows 10具有相同的区域和语言环境设置。在两台电脑上,messagebox窗口具有相同的样式标志,包括WS_EX_LayoutTL

来自PC1的图像-得到镜像:

来自PC2的图像(相同代码):

当传递到PrintWindow的标志为0(而不是PW_RENDERFULLCONTENT)时,图像将在两台电脑中镜像:

为什么会这样

如何确保在不同的PC上以相同的方向打印图像

如果不建议使用。打印的最佳方式是什么 窗口应用程序,如chromium,如果没有此标志,则应用程序为 渲染为黑屏


我使用
PrintWindow
(不带
PW_RENDERFULLCONTENT
)来打印chrome窗口,只要chrome窗口没有最小化,就不会出现黑屏问题。话虽如此,在过去很长一段时间里,Chrome回归黑屏有很多问题

但是,
PrintWindow()
工作不太好。您可以尝试
GetWindowDC()
BitBlt()
从该DC进入位图。或者
GetClientRect()+ClientToScreen()
BitBlt()
从屏幕DC到位图的矩形

或者看看Win10中添加的。或者在Win8中添加。或
Direct3D
。看

参考:

因为您需要用python实现它,所以我建议您使用第一种方法(相对简单),
GetClientRect()+ClientToScreen()和BitBlt()…


代码示例:

两台电脑都有windows 10,具有相同的区域和语言环境设置。这两台电脑的版本是什么?2004? 1903?在我的测试之后,2004版本将有镜像,但在windows 8.1和windows 10 1903上没有镜像。(render_flags=PW_RENDERFULLCONTENT)。我将与相关工程师讨论这个问题。
PW\u RENDERFULLCONTENT
不受支持。不建议使用此选项,因为它可能会在将来某个时候被修改或停止使用。@StraiveSun MSFT,谢谢您的回答。我看到有很多库确实使用了这个标志,例如:If不推荐使用。打印chromium等窗口应用程序的最佳方式是什么?如果没有此标志,应用程序将呈现为黑屏?请参阅:我的版本是2004,当调用标记为0的
PrintWindow
时,它呈现为黑屏。我想知道根本原因是什么。无论如何,最后两个链接都很好,但解决方案建议使用桌面窗口获取图像。有没有一种可靠的方法可以在不将chrome屏幕截图用作前景窗口的情况下获取它?
nFlags
中的@EtanGrundstein只有一个可选参数,即
PW_CLIENTONLY(1)
nflags=0
是没有文档记录的行为,所以我不建议您尝试它。@EtanGrundstein
是否有一种可靠的方法可以获得chrome的屏幕截图而不将其作为前台窗口?
在python中使用
winapi(GetClientRect()+ClientToScreen()和BitBlt())
捕获chrome屏幕是我所知道的最简单的方法。如果你需要研究其他方法,你可能需要研究,我也没有这方面的经验。如果我错了,Sun会纠正我