是在服务器屏幕锁定的情况下,运行服务定时抓图。但在安装在服务器2003上,屏一会就自动上锁了,就抓不到图了。我用了OpenDesktop("Default", 0, false, 33554432),在windows锁定时还是抓不到图,用OpenInputDesktop(0, false, 33554432),锁定时只能抓到windows登录界面,而不能抓到程序运行的界面。请各位帮忙看看怎么实现。用OpenDesktop("Default", 0, false, 33554432)后,switchdeskptop失败,也抓不成。

解决方案 »

  1.   

    截屏吗?
    可以去参考下VNC,开源的
      

  2.   

    在屏保与登录状态下,VNC截出的也是屏保与登录的屏。要是能有办法用服务判断是登录界面时,自动解除锁定状态也行。
      

  3.   

    //图形
    bool ENtool::LHxxDISPLAY_SAVEBMP( char*  FileName,int x,int y,int w,int h )  
    {  
    /*
    HDC hDC = ::GetDC(NULL); //获取屏幕DC
    COLORREF clr = ::GetPixel(hDC, 200, 200); //获取当前鼠标点像素值D3dCom.tp1.x=GetRValue(clr);
    D3dCom.tp1.y=GetGValue(clr); //分解出绿色值
    D3dCom.tp1.z=GetBValue(clr); //分解出蓝色值
    ::ReleaseDC(NULL, hDC); //释放屏幕DC
    */
    HBITMAP  hBitmap;
    RECT rect;
    //获得屏幕分辩率
    rect.left=x;
    rect.top=y;
    rect.right=w+rect.left;
    rect.bottom=h+rect.top;
    // rect.right=GetSystemMetrics(SM_CXSCREEN);
    // rect.bottom=GetSystemMetrics(SM_CYSCREEN);
    //调用截屏函数
    hBitmap=(HBITMAP)GetScreen(&rect); //设备描述表  
    HDC  hDC;  
    //当前分辨率下每象素所占字节数  
    int  iBits;  
    //位图中每象素所占字节数  
    WORD  wBitCount;  
    //定义调色板大小,  位图中像素字节大小  ,位图文件大小  ,  写入文件字节数    
    DWORD  dwPaletteSize=0,  dwBmBitsSize=0,  dwDIBSize=0,  dwWritten=0;    
    //位图属性结构    
    BITMAP  Bitmap;      
    //位图文件头结构  
    BITMAPFILEHEADER  bmfHdr;      
    //位图信息头结构    
    BITMAPINFOHEADER  bi;      
    //指向位图信息头结构      
    LPBITMAPINFOHEADER  lpbi;      
    //定义文件,分配内存句柄,调色板句柄    
    HANDLE  fh,  hDib,  hPal,hOldPal=NULL;    
     
    //计算位图文件每个像素所占字节数    
    hDC  =  CreateDC("DISPLAY",  NULL,  NULL,  NULL);  
    iBits  =  GetDeviceCaps(hDC,  BITSPIXEL)  *  GetDeviceCaps(hDC,  PLANES);    
    DeleteDC(hDC);    
    if  (iBits  <=  1)                        wBitCount  =  1;    
    else  if  (iBits  <=  4)              wBitCount  =  4;    
    else  if  (iBits  <=  8)              wBitCount  =  8;    
    else                                                              wBitCount  =  24;    
     
    GetObject(hBitmap,  sizeof(Bitmap),  (LPSTR)&Bitmap);  
    bi.biSize                                    =  sizeof(BITMAPINFOHEADER);  
    bi.biWidth                                    =  Bitmap.bmWidth;  
    bi.biHeight                                    =  Bitmap.bmHeight;  
    bi.biPlanes                                    =  1;  
    bi.biBitCount                        =  wBitCount;  
    bi.biCompression            =  BI_RGB;  
    bi.biSizeImage                        =  0;  
    bi.biXPelsPerMeter            =  0;  
    bi.biYPelsPerMeter            =  0;  
    bi.biClrImportant            =  0;  
    bi.biClrUsed                        =  0;  
     
    dwBmBitsSize  =  ((Bitmap.bmWidth  *  wBitCount  +  31)  /  32)  *  4  *  Bitmap.bmHeight;  
     
    //为位图内容分配内存    
    hDib  =  GlobalAlloc(GHND,dwBmBitsSize  +  dwPaletteSize  +  sizeof(BITMAPINFOHEADER));    
    lpbi  =  (LPBITMAPINFOHEADER)GlobalLock(hDib);    
    *lpbi  =  bi;     //  处理调色板      
    hPal  =  GetStockObject(DEFAULT_PALETTE);    
    if  (hPal)    
    {    
       hDC  =  ::GetDC(NULL);    
       hOldPal  =  ::SelectPalette(hDC,  (HPALETTE)hPal,  FALSE);    
       RealizePalette(hDC);    
    }   //  获取该调色板下新的像素值    
    GetDIBits(hDC,  hBitmap,  0,  (UINT)  Bitmap.bmHeight,  (LPSTR)lpbi  +  sizeof(BITMAPINFOHEADER)    
       +dwPaletteSize,            (BITMAPINFO  *)lpbi,  DIB_RGB_COLORS);    
     
    //恢复调色板      
    if  (hOldPal)    
    {    
       ::SelectPalette(hDC,  (HPALETTE)hOldPal,  TRUE);    
       RealizePalette(hDC);    
       ::ReleaseDC(NULL,  hDC);    
    }     //创建位图文件      
    fh  =  CreateFile(FileName,  GENERIC_WRITE,0,  NULL,  CREATE_ALWAYS,    
       FILE_ATTRIBUTE_NORMAL    |  FILE_FLAG_SEQUENTIAL_SCAN,  NULL);    
     
    if  (fh  ==  INVALID_HANDLE_VALUE)    return  FALSE;    
     
    //  设置位图文件头    
    bmfHdr.bfType  =  0x4D42;  //  "BM"    
    dwDIBSize  =  sizeof(BITMAPFILEHEADER)  +  sizeof(BITMAPINFOHEADER)  +  dwPaletteSize  +  dwBmBitsSize;      
    bmfHdr.bfSize  =  dwDIBSize;    
    bmfHdr.bfReserved1  =  0;    
    bmfHdr.bfReserved2  =  0;    
    bmfHdr.bfOffBits  =  (DWORD)sizeof(BITMAPFILEHEADER)  +  (DWORD)sizeof(BITMAPINFOHEADER)  +  dwPaletteSize;    
    //  写入位图文件头    
    WriteFile(fh,  (LPSTR)&bmfHdr,  sizeof(BITMAPFILEHEADER),  &dwWritten,  NULL);    
    //  写入位图文件其余内容    
    WriteFile(fh,  (LPSTR)lpbi,  dwDIBSize,  &dwWritten,  NULL);    
    //清除      
    GlobalUnlock(hDib);    
    GlobalFree(hDib);    
    CloseHandle(fh);
    DeleteObject(hBitmap);
    return  TRUE;  
    }