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