HWINSTA   m_hwinsta=0;
HDESK     m_hdesk=0;       // 窗口句柄
BOOL      setDesktop()
{
          m_hwinsta =OpenWindowStation("winsta0",false,MAXIMUM_ALLOWED);
          if (m_hwinsta == NULL)
              return FALSE;
          if (!SetProcessWindowStation(m_hwinsta))
              return FALSE;
          m_hdesk =OpenDesktop("default",0,FALSE,MAXIMUM_ALLOWED);
          if (m_hdesk == NULL)
              return false;
          SetThreadDesktop(m_hdesk);
          return true;
}我的程序在服务中间接启动执行的(ShellExecute()), 现要取当前桌面的画面总是不成,因为进
程属于SYSTEM. 用上面的代码方能取到当前登录的桌面,如何保存画面呢

解决方案 »

  1.   

    把桌面画到一个内存DC对应的内存位图上,再保存成bmp图片.具体你搜索下 "VC 截屏"也给你个仿QQ截屏的程序:
    http://download.csdn.net/source/2761985
      

  2.   

    http://topic.csdn.net/t/20061116/13/5162746.html
    这个贴子 是成功的希望!
      

  3.   

    楼主为神马不做一个进程放到当前桌面的session里面去运行呢?
      

  4.   

    http://topic.csdn.net/t/20061116/13/5162746.html
    这个贴子 是成功的希望!
      

  5.   

    void  Capture()
    {
           INT          FWidth;
           INT          FHeight;
           HDC          HdcDesktop;
           HWND         HwndDesktop;
           HDC          HdcMemory;
           HBITMAP      HBmpMemory;
           PVOID        PDatBitmap;
           BITMAPINFO   BmpInfo;
           BITMAPFILEHEADER  BmpHeader;       FWidth=GetSystemMetrics(SM_CXSCREEN);
           FHeight=GetSystemMetrics(SM_CYSCREEN);       memset(&BmpInfo,   0,   sizeof(BITMAPINFO));
           BmpInfo.bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);
           BmpInfo.bmiHeader.biHeight   =   FHeight;
           BmpInfo.bmiHeader.biWidth   =   FWidth;
           BmpInfo.bmiHeader.biPlanes   =   1;
           BmpInfo.bmiHeader.biBitCount   =   16;
           BmpInfo.bmiHeader.biCompression   =   BI_RGB;
           BmpInfo.bmiHeader.biSizeImage   =   2*FWidth*FHeight;       memset(&BmpHeader,   0,   sizeof(BITMAPFILEHEADER));
           BmpHeader.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER);
           BmpHeader.bfSize   =   BmpInfo.bmiHeader.biSizeImage   +   BmpHeader.bfOffBits;
           BmpHeader.bfType   =   0x4d42;       HwndDesktop   =   GetDesktopWindow();
           HdcDesktop   =   GetDC(HwndDesktop);
           HdcMemory  = CreateCompatibleDC(HdcDesktop);
           HBmpMemory   =   CreateDIBSection(HdcDesktop,&BmpInfo,DIB_RGB_COLORS,&PDatBitmap,NULL,0);
           SelectObject(HdcMemory,HBmpMemory);
           BitBlt(HdcMemory,0,0,FWidth,FHeight,HdcDesktop,0,0,SRCCOPY);       TFileStream *mf=new TFileStream("d:\\test.bmp",fmCreate);
           mf->Write(&BmpHeader,sizeof(BITMAPFILEHEADER));
           mf->Write(&BmpInfo,sizeof(BITMAPINFOHEADER));
           mf->Write(PDatBitmap,BmpInfo.bmiHeader.biSizeImage);       delete mf;
           DeleteObject(HBmpMemory);
           DeleteDC(HdcMemory);
           ReleaseDC(HwndDesktop,HdcDesktop);
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
           Capture();
    }
    原贴截屏这段代码,怎么不对呢。存下的BMP文件看不到图像。
      

  6.   

    呵呵。已经解决!!!!!!!!!!!!!!!!!
    昨天试了一天,未成,今上午莫名其妙成了!也没改源程序,可能机器重启了,
    可能与卸了一次服务有关。截屏一下成功了!我竟然不相信自已的眼睛了。
    为了使后面的人不重复我的费事过程,把源码贴出,积德呀:)。
    void setDesktop() // 切换到用户桌面
    {
      char pvInfo[128]= { 0 };
      DWORD dwLen=0;
      HDESK hActiveDesktop=OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK,false,MAXIMUM_ALLOWED);
      GetUserObjectInformation(hActiveDesktop,UOI_NAME,pvInfo,sizeof(pvInfo),&dwLen);
      CloseDesktop(hActiveDesktop);
      HWINSTA m_hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
      SetProcessWindowStation(m_hwinsta);
      HDESK m_hdesk=OpenDesktop(pvInfo,0,false,MAXIMUM_ALLOWED);
      SetThreadDesktop(m_hdesk);
    }
    void SaveDesktop(TStream *fs,int q) // 保存桌面jpg到流中 图象质量q%
    {
      setDesktop(); // 切换到用户桌面
      RECT r;
      HWND d0=GetDesktopWindow();
      GetWindowRect(d0,&r);
      TCanvas *Canvas0=new TCanvas;
      Canvas0->Handle=GetDC(d0);  Graphics::TBitmap *b=new Graphics::TBitmap();
      b->Height=r.bottom;
      b->Width=r.right;
      b->Canvas->CopyRect(r,Canvas0,r);  TJPEGImage *j=new TJPEGImage();
      j->CompressionQuality=q; // 图象质量 1-100%
      j->Assign(b);
      try
      {
      j->SaveToStream(fs);
      }
      catch(...)
      {
      }
      delete j;
      delete b;
      delete Canvas0;
    }
    就这么一点点长,费了我一个星期,搜的许多旧贴子,许多人遇到同样的苦恼。