How to grab desktop?

BlitzMax Forums/BlitzMax Programming/How to grab desktop?

Hi
I had the same problem. Here is a fast solution for you.

Rem
DesktopPixmap function by Suco-X
End Rem

Strict


Function GetDesktopPixmap:TPixmap()
   
   Extern "Win32"
      Function GetDIBits(hdc:Int, bitmap:Int, Start:Int, Num:Int, bits:Byte Ptr, lpbi:Byte Ptr, usage:Int)
      Function CreateCompatibleBitmap(hdc:Int, Width:Int, Height:Int)
      Function CreateDIBSection(hdc:Int, pbmi:Byte Ptr, usage:Int, Bits:Byte Ptr, hSection:Int, Offset:Int)
      Function SelectObject(hdc:Int, obj:Int)
      Function CreateCompatibleDC(hdc:Int)
      Function GetDesktopWindow()
      Function GetWindowDC(hwnd:Int)
      Function GetDeviceCaps(hdc:Int, index:Int)
      Function DeleteDC(hdc:Int)
      Function DeleteObject(obj:Int)
      Function ReleaseDC(hwdn:Int, hdc:Int)
      Function BitBlt(hdc,x,y,w,h,src_dc,src_x,src_y,dwrop)
   End Extern


   ?Win32
   
      Type BITMAPINFO
         Field biSize:Int
         Field biWidth:Int
         Field biHeight:Int
         Field biPlanes:Short
         Field biBitCount:Short
         Field biCompression:Int
         Field biSizeImage:Int
         Field biXPelsPerMeter:Int
         Field biYPelsPerMeter:Int
         Field biClrUsed:Int
         Field biClrImportant:Int
         
         Field R:Byte
         Field G:Byte
         Field B:Byte
         Field Res:Byte
      End Type
      
      
      Const HORZRES:Int = 8
      Const VERTRES:Int = 10
   
      Local HwndDesktop:Int
      Local hdcDesktop:Int
      Local hdcMem:Int
      Local DesktopWidth:Int
      Local DesktopHeight:Int
      Local bmpMem:Int
      Local INFO:BITMAPINFO
      Local FinalPixmap:TPixmap
   
      HwndDesktop = GetDesktopWindow()
   
      If Not HwndDesktop
         Return Null
      EndIf
      
      
      hdcDesktop = GetWindowDC(HwndDesktop)
      
      If Not HdcDesktop
         Return Null
      EndIf
      
      
      hdcMem = CreateCompatibleDC(hdcDesktop)
      
      If Not HdcMem
         Return Null
      EndIf
      
      
      DesktopWidth = GetDeviceCaps(hdcDesktop, HORZRES)
      DesktopHeight = GetDeviceCaps(hdcDesktop, VERTRES)
   
      If DesktopWidth = 0 Or DesktopHeight = 0
         Return Null
      EndIf
      
      
      bmpMem  = CreateCompatibleBitmap(hdcDesktop, DesktopWidth, DesktopHeight)
   
      If Not BmpMem
         Return Null
      EndIf
      
      
      If Not SelectObject(HdcMem, bmpMem)
         Return Null
      EndIf
      
      Info                = New BITMAPINFO
      Info.bisize         = SizeOf(INFO)
      info.BiWidth        = DesktopWidth
      Info.biHeight       = DesktopHeight
      Info.biPlanes       = 1
      info.biBitCount     = 32
      Info.biCompression  = 0
      
      
      If Not BitBlt(hdcMem,0,0,Info.biWidth,Info.biHeight, hdcDesktop,0,0,ROP_SRCCOPY)   
         Return Null
      EndIf
      
      FinalPixmap = CreatePixmap(info.biWidth, info.biHeight, PF_BGRA8888)
      
      If Not GetDIBits(hdcMem, bmpMem, 0, Info.biHeight, FinalPixmap.PixelPtr(0,0), info, 0)
         Return Null
      EndIf
      
      FinalPixmap = YFlipPixmap(FinalPixmap)
      
      DeleteDC(HdcMem)
      DeleteObject(bmpMem)
      ReleaseDC(hwndDesktop, hdcDesktop)
      
      Return FinalPixmap
      
   ?
   
   ?Linux
      Return Null
   ?
   
   ?MacOs
      Return Null
   ?
End Function



Local Time:Int = MilliSecs()

Local DesktopScreen:TPixmap = GetDesktopPixmap()

Time = MilliSecs()-Time

Print ""
Print "PixmapsPerSecond: "+(1000/Time)
Print ""

If DesktopScreen = Null
   Print "TEST FEHLGESCHLAGEN"
EndIf



Graphics 1024, 768,0

DrawPixmap DesktopScreen,0,0
Flip
WaitKey() 


Win32 only
Mfg Suco