Seite 1 von 2
Mini-Screen-Capture arbeitet nicht!!
Verfasst: 14.01.2006 21:18
von Mok
Ich hab' heute 'nen Mini-Screenshot-Capture geschrieben, aber gleich nach dem ersten Test stand fest - Bug!
Hier ist mein Source:
Code: Alles auswählen
InitSprite() ;Initialisieren der 'Sprite' Libary
InitKeyboard() ; Initialisieren der 'Keyboard' Libary
OpenScreen(640,480,32,"Screenshot Mini-Capture") ; öffnen des Screens
ExamineKeyboard() ; 'Keyboard' ausbauen
Repeat ;VON
If KeyboardPushed(#PB_Key_Tab) ; Wenn ich Tab drücke...
GrabSprite(0,0,0,640,480) ;..dann soll der Screen eingefangen werden.
SaveSprite(0,"C:\Temp\Screenshot.bmp") ;...und gespeichert werden
EndIf
Until KeyboardPushed(#PB_Key_Tab) ; BIS Tab gedrückt wird
CloseScreen() ;schließen des Screens
;
Noch dazu will ich keinen schwarzen Bildschirm fotografieren, sondern den aktuellen Bilschirm! (z.B. Desktop...)
Verfasst: 14.01.2006 21:53
von Macros
Code: Alles auswählen
InitSprite()
Procedure MakeDesktopScreenshot(ImageNr,x,y,Width,Height)
hImage = CreateImage(ImageNr,Width,Height)
hDC = StartDrawing(ImageOutput())
DeskDC = GetDC_(GetDesktopWindow_())
BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
StopDrawing()
ReleaseDC_(GetDesktopWindow_(),DeskDC)
ProcedureReturn hImage
EndProcedure
mit Api, daher leider nur WIndows.
Verfasst: 14.01.2006 22:41
von NicTheQuick
@Macros: [c]InitSprite()[/c] ist hier nicht nötig, da kein DirectX, sondern
reine GUI aus der API.
Verfasst: 14.01.2006 22:57
von MVXA
Du fotografierst auch nicht den Screen sondern eine Sprite...
Verfasst: 14.01.2006 23:37
von Macros
@ NicTheQuick InitSprite ist notwendig, da CreateImage()
@MVXA GetDC_(GetDesktopWindow_() )
Ich kopiere auf ein Sprite
Die Prozedur stammt aus einem funktionierendem Programm von mir,
sie läuft also garantiert.
Verfasst: 15.01.2006 00:03
von Criss
Ich hatte da auch mal was programmiert:
Beachte rechts unten die Taskleistensymbole (Rechtsklick auf den Monitor!)
Code: Alles auswählen
UsePNGImageEncoder()
UseJPEGImageEncoder()
Dateiname.s = ""
Endung.s = ""
ScreenWidth = GetSystemMetrics_(#SM_CXSCREEN)
ScreenHeight = GetSystemMetrics_(#SM_CYSCREEN)
Procedure Screenshot(ImageNr,X,Y,Width,Height)
hImage = CreateImage(ImageNr,Width,Height)
hDC = StartDrawing(ImageOutput())
DeskDC = GetDC_(GetDesktopWindow_())
BitBlt_(hDC,0,0,Width,Height,DeskDC,X,Y,#SRCCOPY)
StopDrawing()
ReleaseDC_(GetDesktopWindow_(),DeskDC)
ProcedureReturn hImage
EndProcedure
If OpenWindow(0, 0, 0, 0, 0, #PB_Window_Invisible, "Screeny")
AddSysTrayIcon(1, WindowID(), LoadImage(0, "screeny.ico"))
If CreatePopupMenu(0)
MenuTitle("Screenshot")
MenuItem(1, "In Speicher")
MenuItem(2, "In Bilddatei")
CloseSubMenu()
MenuItem(3, "Info")
MenuBar()
MenuItem(4, "Beenden")
EndIf
Repeat
Select WaitWindowEvent()
Case #WM_RButtonDown
DisplayPopupMenu(0,WindowID())
Case #PB_Event_Menu
Select EventMenuID()
Case 1
Screenshot(1000, 0, 0, ScreenWidth, ScreenHeight)
SetClipboardData(#PB_ClipboardImage, ImageID())
Case 2
Dateiname = SaveFileRequester("Dateiname zum speichern eingeben!", "screenshot" + Endung, "Bmp (*.bmp)|*.bmp|Jpg (*.jpg)|*.jpg|Png (*.png)|*.png|Alle Dateien (*.*)|*.*", 0)
If Dateiname <> ""
Dateiname = GetFilePart(Dateiname)
Select SelectedFilePattern()
Case 0
Dateiname + ".bmp"
Screenshot(1000, 0, 0, ScreenWidth, ScreenHeight)
SaveImage(1000, Dateiname, #PB_ImagePlugin_BMP)
Case 1
Dateiname + ".jpg"
Screenshot(1000, 0, 0, ScreenWidth, ScreenHeight)
SaveImage(1000, Dateiname, #PB_ImagePlugin_JPEG, 9)
Case 2
Dateiname + ".png"
Screenshot(1000, 0, 0, ScreenWidth, ScreenHeight)
SaveImage(1000, Dateiname, #PB_ImagePlugin_PNG)
EndSelect
MessageRequester("Info", Dateiname + #CRLF$ + "wurde gespeichert!", 0)
EndIf
Case 3
MessageRequester("Info", "Screenshot-Tool v1.0" + #CRLF$ + "--------------------------" + #CRLF$ + "daniel.strohmeier@hispeed.ch" + #CRLF$ + "(C)Jumpingeyes, 2005", 0)
Case 4
Quit = 1
EndSelect
Case #PB_Event_SysTray
If EventType() = #PB_EventType_RightClick
DisplayPopupMenu(0,WindowID())
EndIf
EndSelect
Until Quit = 1
EndIf
End
Verfasst: 15.01.2006 00:31
von NicTheQuick
Macros hat geschrieben:@NicTheQuick: InitSprite ist notwendig, da CreateSprite()
Mach die Augen auf und du siehst da kein [c]CreateSprite()[/c], sondern ein [c]Create
Image[/c].

Verfasst: 15.01.2006 00:38
von nco2k
Code: Alles auswählen
Procedure SaveDesktopScreenshot(File.s) ;gibt #True zurück falls erfolgreich, ansonsten #False
Result.l = #False
Width.l = GetSystemMetrics_(#SM_CXSCREEN)
Height.l = GetSystemMetrics_(#SM_CYSCREEN)
If Width And Height
Image.l = CreateImage(#PB_Any, Width, Height)
If Image
UseImage(Image)
hDC.l = StartDrawing(ImageOutput())
If hDC
DesktopWindow.l = GetDesktopWindow_()
If DesktopWindow
DeskDC.l = GetDC_(DesktopWindow)
If DeskDC
BitBlt_(hDC, 0, 0, Width, Height, DeskDC, 0, 0, #SRCCOPY)
ReleaseDC_(DesktopWindow, DeskDC)
Result = SaveImage(Image, File)
EndIf
EndIf
StopDrawing()
EndIf
FreeImage(Image)
EndIf
EndIf
ProcedureReturn Result
EndProcedure
If SaveDesktopScreenshot("C:\test.bmp") ;ACHTUNG: ersetzt datei, falls schon vorhanden!
Debug "erfolg!"
Else
Debug "misserfolg!"
EndIf
hier mal meine version, ist im grunde das gleiche, nur
sicherer.
@Macros
wo verwendest du bitte CreateSprite() ?!
c ya,
nco2k
Verfasst: 15.01.2006 00:46
von Macros
Entschuldigung: CreateImage()
kommt aber aufs gleiche raus, man braucht InitSprite()
Verfasst: 15.01.2006 00:47
von nco2k
@Macros
erm... nein? brauche ich InitSprite() ??
c ya,
nco2k