Windows 7 下做成系统服务的抓图程序不能抓到桌面图像,求助

pacificlh 2010-11-01 12:22:40

小弟做了一个服务程序,用于对桌面进行抓图操作,系统在XP下面能正常运行,抓图也比较流畅,但如果安装在win 7下面,抓出的图是一个空白(灰白)的bmp图,一次无意在网上看到一篇文章说win 7有多个桌面,请问在win 7 下如何用服务程序抓用户的桌面。谢谢

//----(1)捕捉屏幕图像----
try
des := GetDesktopWindow;
ScreenDC:= GetDC(des);
ScreenBmp:= TBitmap.Create;
ScreenBmp.Width:= GetDeviceCaps(ScreenDC, HORZRES);
ScreenBmp.Height:= GetDeviceCaps(ScreenDC, VERTRES);
BitBlt(ScreenBmp.Canvas.Handle, 0, 0, ScreenBmp.Width-1, ScreenBmp.Height-1,ScreenDC, 0, 0, SRCCOPY);
//----(2)转化成JPEG图像----
JPEGImage:= TJPEGImage.Create;
JPEGImage.Assign(ScreenBmp);
JPEGImage.CompressionQuality:= Quality;
JPEGImage.Compress;
//----(3)将JPEG图像保存到数据流中
Stream.Size:= 0;
JPEGImage.SaveToStream(Stream);
//----(4)释放资源
finally
JPEGImage.Free;
ScreenBmp.Free;
ReleaseDC(des, ScreenDC);
end;
...全文
505 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
li__dong 2012-02-05
  • 打赏
  • 举报
回复
createdc也不行吗
kingcsx666 2011-10-26
  • 打赏
  • 举报
回复
服务管理中,找到并打开该服务属性,把“登录”tab页下面的“允许服务与桌面交互”勾上就OK拉
stonexing5 2011-05-07
  • 打赏
  • 举报
回复
单步调试下 看看那一步出错了
不懂delphi
我的正常
http://hi.baidu.com/xingyan126/blog/item/ff3e8f627d176ad3e6113a4a.html
换一个api试试吧 估计这个GetDesktopWindow不中
zgc7622 2011-04-14
  • 打赏
  • 举报
回复
是的,其实问题就是运行在不同的桌面下的原因。你可以这样做:在Win7下运行一个服务,然后使用服务调用一个Exe让这个exe去截取用户桌面。

在Delphi开发的服务中调用指定应用程序
http://www.88dev.com/forum-viewthread-tid-73-fromuid-2.html 这篇帖子兴许对你有用
Lactoferrin 2011-04-10
  • 打赏
  • 举报
回复
dwm.exe(管玻璃效果的)仅用于WinSta0\Default桌面
Lactoferrin 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sforiz 的回复:]
ScreenDC:= GetDC(0);

这样不就是获取桌面的DC了吗
[/Quote]
这是获取当前线程所在桌面的dc,服务程序的线程缺省情况下在Session0\Service-0x0-3e7$\Default桌面
session0是会话,Service-0x0-3e7$是窗口站(还可能有别的),Default是桌面,是一级一级从属的关系

用户看到的桌面是ConsoleSession(可能是0,1,2...)\WinSta0\Default

缺省情况下服务程序的窗口站肯定是和用户看到的桌面所在的窗口站不同,windows vista起连会话都不会相同

你需要在ConsoleSession(用WTSGetActiveConsoleSessionId得到)中的WinSta0窗口站的Default桌面创建一个进程,由这个进程来截图
sforiz 2011-04-10
  • 打赏
  • 举报
回复
ScreenDC:= GetDC(0);

这样不就是获取桌面的DC了吗
zgc7622 2011-03-26
  • 打赏
  • 举报
回复
我也越到这个问题,顶上去。
pacificlh 2010-11-01
  • 打赏
  • 举报
回复
看了,普通程序运行都可以抓图,但做成服务程序运行就不能抓图。
SQLDebug_Fan 2010-11-01
  • 打赏
  • 举报
回复
用Spy++看看桌面的名字,然后获取句柄抓图试试。
haitao 2010-11-01
  • 打赏
  • 举报
回复
服务运行的用户会话id与登录用户的会话id不同
就类似远程桌面,多个人同时登录了,但是看不到别人的桌面
gyk120 2010-11-01
  • 打赏
  • 举报
回复
服务是处于winsta0桌面的,一般的程序是winsta1桌面,所以服务抓不到……
lqfcu2 2010-11-01
  • 打赏
  • 举报
回复
要进行,桌面切换的。。。。。。你要不做成服务程序的话,试下注销肯定是抓不到系统登录界面的,参考下VNC的代码吧,N多版本的VNC都是开源的。而且WIN7下开玻璃效果的话,GDI抓图很慢。。
武稀松 2010-11-01
  • 打赏
  • 举报
回复
服务程序是不属于任何桌面的.你看看你的GetDesktopWindow返回的啥

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧