小弟做了一个服务程序,用于对桌面进行抓图操作,系统在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;

解决方案 »

  1.   

    用Spy++看看桌面的名字,然后获取句柄抓图试试。
      

  2.   

    服务程序是不属于任何桌面的.你看看你的GetDesktopWindow返回的啥
      

  3.   

    要进行,桌面切换的你要不做成服务程序的话,试下注销肯定是抓不到系统登录界面的,参考下VNC的代码吧,N多版本的VNC都是开源的。而且WIN7下开玻璃效果的话,GDI抓图很慢。。
      

  4.   

    服务是处于winsta0桌面的,一般的程序是winsta1桌面,所以服务抓不到……
      

  5.   

    服务运行的用户会话id与登录用户的会话id不同
    就类似远程桌面,多个人同时登录了,但是看不到别人的桌面
      

  6.   

    ScreenDC:= GetDC(0);这样不就是获取桌面的DC了吗
      

  7.   

    这是获取当前线程所在桌面的dc,服务程序的线程缺省情况下在Session0\Service-0x0-3e7$\Default桌面
    session0是会话,Service-0x0-3e7$是窗口站(还可能有别的),Default是桌面,是一级一级从属的关系用户看到的桌面是ConsoleSession(可能是0,1,2...)\WinSta0\Default缺省情况下服务程序的窗口站肯定是和用户看到的桌面所在的窗口站不同,windows vista起连会话都不会相同你需要在ConsoleSession(用WTSGetActiveConsoleSessionId得到)中的WinSta0窗口站的Default桌面创建一个进程,由这个进程来截图
      

  8.   

    dwm.exe(管玻璃效果的)仅用于WinSta0\Default桌面
      

  9.   

    是的,其实问题就是运行在不同的桌面下的原因。你可以这样做:在Win7下运行一个服务,然后使用服务调用一个Exe让这个exe去截取用户桌面。在Delphi开发的服务中调用指定应用程序
    http://www.88dev.com/forum-viewthread-tid-73-fromuid-2.html 这篇帖子兴许对你有用
      

  10.   

    单步调试下 看看那一步出错了
    不懂delphi
    我的正常
    http://hi.baidu.com/xingyan126/blog/item/ff3e8f627d176ad3e6113a4a.html
    换一个api试试吧 估计这个GetDesktopWindow不中
      

  11.   

    服务管理中,找到并打开该服务属性,把“登录”tab页下面的“允许服务与桌面交互”勾上就OK拉