Screenshot die x-te

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Screenshot die x-te

Beitrag von ahle bemm »

Hallo zusammen,
also ich habe folgendes Problem.
Ich habe ein Programm mit transparenten Windows erstellt.

Code: Alles auswählen

Procedure SetWinTransparency (WinHandle.l, Transparency_Level.l) 
  SetWindowLong_(WinHandle,#GWL_EXSTYLE,$00080000)                 ; #WS_EX_LAYERED = $00080000 
  SetLayeredWindowAttributes_(WinHandle,0,Transparency_Level,2)    ; 
EndProcedure 
zudem lasse ich das Window auch noch aus der Taskbar verschwinden.

Code: Alles auswählen

  hWnd = OpenWindow(0, 0, 0,0,0,#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible, "")
  SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW)
  HideWindow(0,0)
nun will ich vom Desktop einen Screenshot machen, aber leider habe ich noch keinen Weg gefunden das zu bewerkstelligen
Wer kann helfen, die Codes vom Codearchiv und hier aus dem Forum habe ich glaube ich alle durch
Gruß michael
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

meinst du sowas?

Code: Alles auswählen

Procedure MakeAScreenshot(Image,x,y,Width,Height)  
  hImage = CreateImage(Image,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
-.-"
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Beitrag von ahle bemm »

Hallo,
um das vielleicht besser zu verstehen, habe ich auf die schnelle etwas Code geschrieben, der dann auch läuft, damit jeder sieht was ich meine.

Code: Alles auswählen

Procedure SetWinTransparency (WinHandle.l, Transparency_Level.l) 
  SetWindowLong_(WinHandle,#GWL_EXSTYLE,$00080000)                 ; #WS_EX_LAYERED = $00080000 
  SetLayeredWindowAttributes_(WinHandle,0,Transparency_Level,2)    ; 
EndProcedure 

Procedure ShowBild(File$)
  LoadImage(0, File$)
  ResizeWindow(ImageWidth(), ImageHeight())
  MoveWindow((GetSystemMetrics_(#SM_CXSCREEN)/2)-(ImageWidth()/2), (GetSystemMetrics_(#SM_CYSCREEN)/2)-(ImageHeight()/2))
  ResizeGadget(0,0,0,ImageWidth(), ImageHeight())
  SetGadgetState(0,UseImage(0))
EndProcedure

Procedure RebuiltWindow()
  CloseWindow(0)
  hWnd = OpenWindow(0, 0, 0,0,0,#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible, "")
  CreateGadgetList(hWnd)
  ImageGadget(0,0,0,0,0,0)
  SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW)
  HideWindow(0,0)
  SetWinTransparency(hWnd,250)
  SetWindowPos_(WindowID(0), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
EndProcedure

Procedure Screenshot()
    hImage = CreateImage(1,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))  
    hDC    = StartDrawing(ImageOutput())  
    DeskDC = GetDC_(GetDesktopWindow_())  
    BitBlt_(hDC,0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN),DeskDC,X,Y,#SRCCOPY)  
    StopDrawing()  
    ReleaseDC_(GetDesktopWindow_(),DeskDC)
    ResizeImage(1,350,270)
    SetGadgetState(1,UseImage(1))
EndProcedure 

Procedure open_window()
  If OpenWindow(1, 10, 10, 390, 330,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Screenshot")
    If CreateGadgetList(WindowID(1))
      ImageGadget(1, 10,10,350,270,0)                            
    EndIf
  EndIf
EndProcedure

UseJPEGImageDecoder()
UseJPEGImageEncoder()
open_window()
RebuiltWindow()
ShowBild(OpenFileRequester("Wählen sie jpg Bilder aus","c:\","Jpg Bilder|*.jpg;*.jpeg;|All Files|*.*",0,0))
Delay(1000)
Screenshot()

Repeat 
  Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadgetID()
          Case 1
        EndSelect 
    EndSelect
  Until Event = #PB_Event_CloseWindow
Hoffe damit wird klarer das das transparente Image nicht mit abgespeichert wird
Gruß Michael

PS: den Code von Green Snake habe ich hier schon übernommen, leider ohne Erfolg
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Beitrag von ahle bemm »

Also mit der Windows Funktion "shift druck" die es auch schon bei win98 gab, funktioniert das im übrigen.
Die ApiFunktion PrintWindow gibts aber erst seit Windows XP

Hat jemand Ahnung was für eine Funktion da Windows verwenden könnte?

Wenn ja wie kann ich diese in PureBasic integrieren. Im übrigen schaffen alle Screenshot Programme das, irgendeine Routine wird es doch da geben?
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 »

Du musst doch nur mit [c]GetForegroundWindow_()[/c] das Handle das
aktiven Fensters holen, dann mit [c]GetClientRect_()[/c] die
Fensterkoordinaten und mit [c]GetWindowRect_()[/c] Breite und Höhe
holen, oder?

Schnell dahin gecodetes Beispiel:

Code: Alles auswählen

hWindow.l = GetForegroundWindow_()
If hWindow
  RectWindow.RECT
  If GetClientRect_(hWindow, @RectWindow)
    Width.l = RectWindow\right
    Height.l = RectWindow\bottom
  EndIf
  If GetWindowRect_(hWindow, @RectWindow)
    x.l = RectWindow\left
    y.l = RectWindow\top
  EndIf
EndIf

string.s = "Window-Handle: " + Str(hWindow) + #CRLF$
string   + "Koordinaten: " + Str(x) + ", " + Str(y) + #CRLF$
string   + "Breite/Höhe: " + Str(Width) + ", " + Str(Height)

;gibt die Koordinaten des aktuellen Fensters aus
MessageRequester("Info", string)
Vielleicht gehts auch einfacher... :wink:
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Beitrag von ahle bemm »

Hallo NicTheQuick,
Es ist kein Problem einen Screenshot des einzelnen Fensters zu machen, funktioniert prima, nur dabei gibts auch keine Transparenz zu sehen.

Lösung wird wohl sein das ich überprüfe welches OS verwendet wird und dann je nachdem eine Routine verwende, weil soweit ich das richtig verstanden habe gibts die Funktion PrintWindow in der user32.dll und die schafft das wohl. Bei win98 und ME gabs die wohl noch nicht, aber dort gibts meines wissens nach auch keine transparenten Fenster.

Nur habe ich noch nie mit Dll gearbeitet die Purebasic nicht kennt, werde mich darin zuerst einmal einlesen.

Gruß Michael
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Beitrag von ahle bemm »

Also Printwindow klappt mit Windows die man selber erstellt hat. Mit dem desktop klappt das irgendwie nicht.

Das Problem mit den layered Windows bleibt. Soweit ich mich jetzt durchgegoogelt habe ist das Problem auch bei anderen Programmiersprachen bekannt. Die Windows Funktion Shift Druck funktioniert, aber niemand weiß wie man da ran kommt.

Das es geht, zeigt mir z.Bsp das Programm RealVNC, nur wie kann niemand oder will keiner sagen.
gruß Michael
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Linker Error !!!

Beitrag von PureLust »

Ähmmm, ...

steh ich auf dem Schlauch, oder hab ich bei Deinem o.g. Code als einziger das Problem, dass ich einen Linker Error bekomme (PB v3.94)?

Code: Alles auswählen

POLINK: warning: Multiple '.data' section found with different flags (0xc0000040 and 0x60000040).
POLINK: fatal erroe: Es steht nicht genügend Speicherplatz auf dem Datenträger zur Verfügung.

Zur Info: Auf beiden Partitionen der HD sind noch knapp 40GB frei.


Liegt das am o.g. Code ... oder könnte es ggfl. an meinem System liegen?
Hat jemand vielleicht 'ne Idee ??? :|

ThanXXX und Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
ahle bemm
Beiträge: 10
Registriert: 23.10.2005 17:41

Beitrag von ahle bemm »

was mir vielleicht einfallen würde das du kein XP oder 2000 zur verfügung hast, ansonsten bei mir gehts ohne Fehler
Gruß Michael
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Grrrrrrrrrrrrrrrrrrrrrrrr ...

Beitrag von PureLust »

Sorry ... hab das Problem scheinbar gerade lokalisiert:

Volumefehler auf Laufwerk D: !!!

Notebook-Platte wohl im Eimer !!!
>_<>_<>_<>_<>_<>_<>_<
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten