已尝试 https://stackoverflow.com/a/30138664/533237并能够捕获屏幕。
但我想从 session 0 或另一个用户中运行的应用程序捕获屏幕。在捕获之前引入 10 秒的 sleep 并切换到另一个用户。 还尝试了 PsExec.exe -h -s E:\sc.exe。都抛出错误
C:\Users\unity\Documents\Visual Studio 2015\Projects\ConsoleApplication2\Debug>sc.exe
FAILURE 0x8876086C (-2005530516)
line: 60 file: 'c:\users\unity\documents\visual studio 2015\projects\consoleapplication2\consoleapplication2\consoleapplication2.cpp'
expr: 'd3d->GetAdapterDisplayMode(adapter, &mode)'
C:\Users\unity\Documents\Visual Studio 2015\Projects\ConsoleApplication2\Debug>PsExec.exe -h -s E:\sc.exe -w E:\
PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
FAILURE 0x8876086C (-2005530516)
line: 60 file: 'c:\users\unity\documents\visual studio 2015\projects\consoleapplication2\consoleapplication2\consoleapplication2.cpp'
expr: 'd3d->GetAdapterDisplayMode(adapter, &mode)'
注释掉 GetAdapterDisplayMode 并硬编码高度和宽度,但 CreateDevice 失败
FAILURE 0x8876086A (-2005530518)
line: 76 file: 'c:\users\unity\documents\visual studio 2015\projects\consoleapplication2\consoleapplication2\consoleapplication2.cpp'
expr: 'd3d->CreateDevice(adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, ¶meters, &device)'
编辑: 想法是让一个应用程序在后台运行并捕获任何显示的内容,无论用户是否登录,甚至没有人登录(锁定/登录屏幕)
最佳答案
这有两个层面的问题。
在一个层面上,虽然很多 GDI 都可以工作,但 session 0 没有链接到功能显示设备,当然也不是支持 D3D 的设备。
在另一个层面上,虽然引入了 DWM 之类的东西,但 Windows API 始终提供一种显示模型,其中根本不存在不可见的屏幕像素。整个窗口显示模型是围绕让窗口协作绘制到共享显示表面而构建的,并且桌面组合系统根据需要重新绘制窗口的任何未被覆盖的部分。
这意味着,从根本上说,您无法从 session 0 中截屏任何内容,因为要做到这一点, session 0 必须连接到事件显示设备。
关于c++ - session 0 捕获屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33435295/