Seite 1 von 2
					
				Screenshot die x-te
				Verfasst: 23.10.2005 17:48
				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
 
			
					
				
				Verfasst: 23.10.2005 18:11
				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
 
			
					
				
				Verfasst: 23.10.2005 20:03
				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
 
			
					
				
				Verfasst: 25.10.2005 11:11
				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?
			 
			
					
				
				Verfasst: 25.10.2005 13:58
				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... 

 
			
					
				
				Verfasst: 25.10.2005 22:31
				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
			 
			
					
				
				Verfasst: 26.10.2005 08:43
				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
			 
			
					
				Linker Error !!!
				Verfasst: 26.10.2005 21:04
				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.
 
ThanXXX und Gruß, PL. 
			
					
				
				Verfasst: 26.10.2005 22:29
				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
			 
			
					
				Grrrrrrrrrrrrrrrrrrrrrrrr ...
				Verfasst: 26.10.2005 23:12
				von PureLust
				Sorry ... hab das Problem scheinbar gerade lokalisiert:
Volumefehler auf Laufwerk D: !!! 
Notebook-Platte wohl im Eimer !!!

>_<>_<>_<>_<>_<>_<