Mini-Screen-Capture arbeitet nicht!!

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Mini-Screen-Capture arbeitet nicht!!

Beitrag 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...)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Macros: [c]InitSprite()[/c] ist hier nicht nötig, da kein DirectX, sondern
reine GUI aus der API.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Du fotografierst auch nicht den Screen sondern eine Sprite...
Bild
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von Macros am 15.01.2006 00:47, insgesamt 1-mal geändert.
Benutzeravatar
Criss
Beiträge: 126
Registriert: 21.09.2004 18:45
Kontaktdaten:

Beitrag 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
"Zu glauben, der Mensch sei Einschränkungen unterworfen, ist die grösste Illusion von allen." Robert Allan Monroe
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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]CreateImage[/c]. /:-> <)
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Entschuldigung: CreateImage()
kommt aber aufs gleiche raus, man braucht InitSprite()
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@Macros
erm... nein? brauche ich InitSprite() ?? :)

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Antworten