我正在使用CreateDesktop API创建桌面,并且希望在不向用户显示桌面的情况下,能够截取屏幕或发送鼠标/键盘输入信号。有没有什么好的实现方法?
我正在使用CreateDesktop API创建桌面,并且希望在不向用户显示桌面的情况下,能够截取屏幕或发送鼠标/键盘输入信号。有没有什么好的实现方法?
编辑: 对于不可见的桌面,这种方法行不通。我查看了我的旧代码,发现我需要它来捕获活动桌面(不是“WinSta0\Default”),为了获取活动用户桌面的句柄,我使用了OpenInputDesktop。
+1 ThievingSix 你是对的。
抱歉,我误解了。
如果您使用CreateDestkop创建桌面,则需要使用SetThreadDesktop(然后将其句柄传递给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. 我不确定这是否适用于“发送输入鼠标/键盘”(应该可以),但对于截屏有效。
编辑: