How to grab desktop?

BlitzMax Forums/BlitzMax Programming/How to grab desktop?

Are there any examples?

Not cross platform, might be some windows effort around someplace.

Would be nice to have a Desktop object in Max, regardless of platform, that you can grab or whatever.

hmm potential idea ... needs work. Minimise app, put Prn Screen into the keyboard cue (this can be done, I've done it in Delphi), Desktop is now in the copy/paste buffer, copy if out into a Pixmap...

OK, now the hard bit, code that.

Also BlitxMax has GetDesktopWindow() (or at least I use it, actaully I've Externed it from "win32") so this gives you a handle, is there a way to grab the display from that handle?

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

that's pretty neat.