Are there any examples?
How to grab desktop?
BlitzMax Forums/BlitzMax Programming/How to grab desktop? 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.
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?
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.
Win32 only
Mfg Suco
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.