我正在使用createdesktop api创建桌面,我想在不显示桌面的情况下拍摄屏幕截图或发送输入鼠标/键盘给user.any ideeas,了解如何实现这一点?
发布于 2011-01-03 06:45:26
编辑:这对隐形桌面不起作用,我已经看过我的旧代码,我发现我需要它来捕捉 active 桌面的屏幕截图(它是而不是 'WinSta0\Default'),以获得我使用OpenInputDesktop的活动用户桌面的句柄。
+1 ThievingSix你是对的,。
对于我的误解,很抱歉。
您需要使用SetThreadDesktop (如果您通过CreateDestkop创建桌面,那么您就有它的句柄,并将其传递给SetThreadDesktop)。切换桌面线程后,可以抓取截图。一个好主意是为线程恢复到以前的桌面(不‘破坏’其他/未来的代码)。
var
lOldDesktop: HDESK;
begin
lOldDesktop:= GetThreadDesktop(GetCurrentThreadId);
try
if not SetThreadDesktop(ADesktop) then // pass handle to your desktop, or dekstop handle obtained from OpenInputDesktop
{error handle, like RaiseLastOSError or Exit(False)};
// your screenshot/input/mouse code here
finally
if lOldDesktop<> 0 then // GetThreadDesktop can fail (I don't know condition when this GetThreadDesktop(GetCurrentThreadId) could fail)
SetThreadDesktop(lOldDesktop); // revert thread to previous desktop
end;
end;
这段代码应该像ThievingSix指出的那样在非主线程中运行,因为在这种情况下SetThreadDesktop可能会失败。安全的方法是生成线程来制作截图。
PS。我不确定这是否适用于“发送输入鼠标/键盘”(应该可以),但对于屏幕截图有效。
编辑
http://blogs.technet.com/b/askperf/archive/2007/07/24/sessions-desktops-and-windows-stations.aspx
)-
发布于 2011-01-04 01:27:57
我发现的简短答案是你不能,你不能截取一个非活动桌面的屏幕截图,因为没有画图调用,因为没有可见的窗口可以重绘。
您可以执行SwitchDesktop()调用,屏幕截图,然后返回SwitchDesktop()。用户不会注意到这一点,但你可能不会在屏幕截图中得到太多,因为在这么短的时间内窗口没有时间重新绘制。
另外,您必须创建一个新线程来调用SetThreadDesktop()。如果您使用主线程来执行此操作,则在使用GUI应用程序时将失败。当当前桌面中有一个窗口时,SetThreadDesktop()会失败。
SysInternals有一个管理多个桌面的应用程序(如linux桌面交换机)。当您要选择要切换到的桌面时,它会显示桌面的缩略图。此缩略图不是实时的,它是在用户处于该桌面时由最后一次已知的完全重绘捕获的。简而言之,如果SysInternals不能进行实时截图,我怀疑我们中的任何一个人都能做到。
这当然是基于我自己对这个确切特征的研究。如果有人真的让它工作了,我很想知道,所以我也不能使用它!
https://stackoverflow.com/questions/4580520
复制相似问题