Seite 1 von 1

Screenshot wird nicht erstellt ?

Verfasst: 29.03.2008 15:30
von pureanfänger
Also ich habe folgendes Problem. Mein Programm soll auf Tastendruck ein Screenshot vom aktuellen Desktop erstellen. Ich habe bisher folgende Api-Funktion verwendet:

keybd_event_(#VK_SNAPSHOT, 0, 0, 0)
Delay(100)
GetClipboardImage(#Image_0)
UseJPEGImageEncoder()
Save_Picture = SaveImage(#Image_0, "Screenshot.jpg", #PB_ImagePlugin_JPEG )

Das Programm erstellt nur dann ein Bild, wenn vorher schon ein Bild im Clipboard befindet, andernfalls stürzt das Programm ab.

Gibt es noch andere Möglichkeiten ein Screenshot vom aktuellen Desktop zu erzeugen ?

LG Pureanfänger :-)

Verfasst: 29.03.2008 15:40
von mk-soft
Bei geht es.

Welches PB und Betriebssystem?

Verfasst: 29.03.2008 15:45
von NicTheQuick
Versuchs mal mit einem größeren Timeout und Error-Handling:

Code: Alles auswählen

Save_Picture = ""
UseJPEGImageEncoder()
keybd_event_(#VK_SNAPSHOT, 0, 0, 0)
time = ElapsedMilliseconds() + 2000 ;Timeout nach 2 Sekunden
While time > ElapsedMilliseconds()
  Delay(100)
  If GetClipboardImage(#Image_0)
    Save_Picture = SaveImage(#Image_0, "Screenshot.jpg", #PB_ImagePlugin_JPEG ) 
    Break
  EndIf
Wend
If Save_Picture
  Debug "Screenshot gespeichert!"
Else
  Debug "Screenshot nicht gespeichert!"
EndIf

Verfasst: 29.03.2008 16:09
von pureanfänger
@ mk-soft

PB 4.10 und WinXP

@NicTheQuick

Hab ich auch versucht, es zeigt den gleichen Fehler.

Re: Screenshot wird nicht erstellt ?

Verfasst: 29.03.2008 16:18
von scholly
pureanfänger hat geschrieben:Gibt es noch andere Möglichkeiten ein Screenshot vom aktuellen Desktop zu erzeugen?

Code: Alles auswählen

;nicolaus - http://www.purebasic.fr/german/viewtopic.php?t=10790

Procedure.l CaptureScreen()
  ExamineDesktops()
  width = DesktopWidth(0)
  height = DesktopHeight(0)
  srcDC = CreateDC_("DISPLAY", "", "", dm.DEVMODE)
  trgDC = CreateCompatibleDC_(srcDC)
  BMPHandle = CreateCompatibleBitmap_(srcDC, width, height)
  SelectObject_( trgDC, BMPHandle)
  BitBlt_( trgDC, 0, 0, width, height, srcDC, 0, 0, #SRCCOPY)
  DeleteDC_( trgDC)
  ReleaseDC_(BMPHandle, srcDC)
  CreateImage(0, width, height, 32)
  StartDrawing(ImageOutput(0))
  DrawImage(BMPHandle, 0, 0)
  StopDrawing()
  DeleteObject_(BMPHandle)
EndProcedure

OpenWindow(0,0,0,320,240,"",$CF0001)
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)

Delay(100)
CaptureScreen()
ResizeImage(0,640,480)
OpenWindow(1,0,0,640,480,"",$CF0001)
CreateGadgetList(WindowID(1))
ImageGadget(0,0,0,0,0,ImageID(0))
Repeat:Until WaitWindowEvent()=#WM_CLOSE

Verfasst: 29.03.2008 19:04
von pureanfänger
Vielen Danke Scholly... du bist mein Retter gewesen !!! Und auch nochmal danke an die anderen.

Verfasst: 29.03.2008 19:54
von scholly
Ich war's nich :oops: , ich hab nur den Thread mit der Routine von Nicolaus irgendwann mal gefunden: http://www.purebasic.fr/german/viewtopic.php?t=10790