会话0捕获屏幕

时间:2015-10-30 11:48:44

标签: c++ windows directx

尝试https://stackoverflow.com/a/30138664/533237并能够捕获屏幕。

但我想从会话0或其他用户运行的应用程序中捕获屏幕。在捕获之前引入10秒睡眠并切换到另一个用户。 还尝试了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, &parameters, &device)'

编辑: 想法是让一个应用程序在后台运行并捕获任何显示的内容,无论用户是否登录,或者即使没有人登录(锁定/登录屏幕)

1 个答案:

答案 0 :(得分:1)

这有两个层面的问题。

在一个层面上,虽然很多GDI都能正常工作,但是会话0没有链接到功能显示设备,当然也不能连接到D3D。

另一方面,虽然引入了DWM之类的东西,但Windows API总是提供一种显示模型,其中不存在不可见的屏幕像素。整个窗口显示模型是围绕将窗口合作绘制到共享显示器表面而构建的,窗口中未被覆盖的任何部分都会根据桌面合成系统的要求重新绘制。

这意味着,从非常根本的方面来说,你无法从会话0屏幕捕获任何内容,因为为了这样做,会话0必须连接到活动的显示设备。