ich habe ein Problem mit einem Code aus dem Forum, welcher einen (Teil-)Screenshot von einem fremden Fenster anfertigt. Es muss dazu ein Teil des Fenstertitels des zu grabbenden Fensters in Zeile 21 eingetragen werden. In meinem Fall ist das das Fenster des Programms 'Total Commander', aber ihr könnt hier auch Notepad eintragen oder was auch immer bei Euch gerade für Fenster geöffnet sind.
Das Beispiel ist ein reiner Testcode und daher nicht sonderlich schön.
Das Problem das ich damit habe ist, dass der Screenshot zwar korrekt angefertigt wird, aber sobald über dem gegrabbten Fenster ein anderes Fenster liegt, wird das obere Fenster gegrabbt. Es sieht fast so aus als würde immer der DC des Desktops benutzt werden, was ich nicht verstehe, weil: DC = GetDC_(WindowHandle) und Windowhandle ist nun mal das handle des Fensters im Hintergrund.
Kann das jemand aufklären?
Gruß Kurzer
Code: Alles auswählen
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=8244&highlight=
; Author: freak
; Date: 10. November 2003
; OS: Windows
; Demo: No
EnableExplicit
Global.l Breite = 500, Hoehe = 300, OffsetX = 0, OffsetY = 0
; Procedure that will be called for each window... 
Procedure.l EnumProcedure(WindowHandle.i, Parameter.l) 
	Protected.i DC, MyDC
	Protected.s Title$
	
  ; get Title by windowhandle... 
  Title$ = Space(200) 
  GetWindowText_(WindowHandle, @Title$, 200) 
  
  ; do whatever to check... 
  If FindString(Title$, "Total Commander", 1) <> 0 
	  	DC = GetDC_(WindowHandle)
  		MyDC = StartDrawing(ImageOutput(0))
  		Debug Title$
  		Debug WindowHandle
	  	If DC
		  	Debug DC
        BitBlt_(MyDC,0,0,Breite,Hoehe,DC,OffsetX,OffsetY,#SRCCOPY)
		  	Debug ReleaseDC_(WindowHandle, DC)
		  EndIf
		  StopDrawing()
    ; returning 0 will stop the search 
    ProcedureReturn 0 
  Else 
  
    ; returning <> 0 will continue till all windows are searched 
    ProcedureReturn 1 
  EndIf 
  
EndProcedure 
Procedure ViewImage()
  Protected Event
  
  If OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "Image", #PB_Window_SystemMenu)
    ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    CloseWindow(0)
  EndIf
EndProcedure
CreateImage(0,Breite,Hoehe)
; find windows... 
EnumWindows_(@EnumProcedure(), 0)  ; the 0 will be passed in Paremeter.l to the procedure 
ViewImage()
FreeImage(0)
End



 Trotzdem würde mich schon interessieren warum es mit GetDC_() und BitBlt_() nicht geht.  Hmmm, ominös.
 Trotzdem würde mich schon interessieren warum es mit GetDC_() und BitBlt_() nicht geht.  Hmmm, ominös. 
 

