Deutsch
Forum

Erledigt: Screenshot OHNE das Programmfenster

 

Sven
Bader
Hat irgendjemand eine Lösung in seinem Fundus, einen Screenshot ohne das aktuelle Programmfenster zu machen bzw. insbesondere einen Screenshot von dem was gerade unter meinem Programmfenster ist zu machen?

Was ich damit vorhabe?
Ich arbeite viel mit freien Fensterformen, bei denen die Kanten leider immer angefressen aussehen wegen fehlendem Antialiasing. Nun habe ich eine Lösung programmiert, welche mit einer Alphamaske die Pixel im Randbereich entsprechend mit dem Hintergrund mischt und so weiche Kanten erzeugt. Probleme gibt es dann, wenn sich der Hintergrund ändert oder ich das Fenster nur ein kleines Stück verschiebe - deshalb brauche ich einen Screenshot von dem was unter dem Programmfenster ist.

Wenn es dann mal funktioniert, stelle ich den Code gerne zur Verfügung
 
05.10.2009  
 



Die Pixel unter einem Fenster sind imho nicht wirklich irgendwo gespeichert.
 
05.10.2009  
 




Sven
Bader
müssen sie, ansonsten gäbe es ab windows xp keine teiltransparenten fenster!

90 kB
Hochgeladen:05.10.2009
Ladeanzahl100
Herunterladen
 
05.10.2009  
 




Dieter
Zornow
Vielleicht kannst du bevor dein Fenster sichtbar wird, also beim starten einen Screenshot machen. Aber das ist denke ich keine Lösung. Wenn ich zum Beispiel 3 Programme offen habe und die schließe verändert sich alles. Du müsstest permanent jede Sekunde einen machen.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
05.10.2009  
 




Sven
Bader
ich mache schon permanent screenshots und spare dabei immer die aktuelle position meines programmes aus - das funktioniert richtig gut nur eben dann nicht wenn sich eigenständig etwas unter dem programmfenster ändert oder ich es nur ein winziges stück verschiebe.

habe noch ein indiz dafür das es gehen muss ;) es gibt bildschirmlupen, welche direkt unter dem mauszeiger angezeigt werden.
 
05.10.2009  
 




Frank
Abbing
Sven Bader, Beitrag=54385, Zeitpunkt=05.10.2009
müssen sie, ansonsten gäbe es ab windows xp keine teiltransparenten fenster!


Hm, ich glaube, jedes Programm muss sein Fenster selber restaurieren. Das System verfügt über keine Kopie. Es schaltet sich nur dazwischen, wenn die Optik transparent erfolgen soll und regelt dann entsprechend die grafische Ausgabe.
 
06.10.2009  
 



Sven Bader, Beitrag=54385, Zeitpunkt=05.10.2009
müssen sie, ansonsten gäbe es ab windows xp keine teiltransparenten fenster!


Nein, dass ist kein Grund, Windows überzeichnet nur die vorderen Regionen nicht.
 
06.10.2009  
 




Sven
Bader
Hier klappts auch ohne Transparenz:
[...] 
 
06.10.2009  
 



Nein, hier wird nur ein Bild vom Desktop geschossen und dieses wird dann gezoomt - als würde man WindowStyle 16 | 32 | 64 nutzen. Hübsche Lupe. ^^
 
06.10.2009  
 




Andreas
Miethe


iF, Beitrag=54384, Zeitpunkt=05.10.2009
Die Pixel unter einem Fenster sind imho nicht wirklich irgendwo gespeichert.


Du kannst aber trotzdem drankommen an diese Pixel.

Das Beipiel blittet die Pixel vom Desktop in ein DC und von da gestreckt ins Profanfenster.
Um das mit allen sichtbaren, ausser dem eigenen Fenster zu machen, müssen also die Fenster gezählt werden, die Position und Z-Order ermittelt werden. Danach kann dann für jedes Fenster wie im Beispiel ein DC gemacht werden und alles zusammengeblittet werden. Und schon hast Du ein nettes Bild vom Bildschirm ohne Dein Fenster.
KompilierenMarkierenSeparieren
 $H Windows.ph
 $H Messages.ph
cls

Proc GetDesktop

    Declare h&
    h& = ~FindWindow("Progman",0)
    h& = ~FindWindowEx(h&, 0, "SHELLDLL_DefView",0)
    h& = ~FindWindowEx(h&, 0, "Internet Explorer_Server",0)

    if h& > 0

        Return h&

    else

        h& = ~FindWindow("Progman",0)
        h& = ~FindWindowEx(h&, 0, "SHELLDLL_DefView",0)
        h& = ~FindWindowEx(h&, 0, "SysListView32",0)
        Return h&

    endif

EndProc

erstmal ein DC für den Bildschirm
Var C_DC& = ~CreateCompatibleDC(%hdc)
Var C_Bitmap& = ~CreateCompatibleBitmap(%hdc,%maxx,%maxy)
~SelectObject(C_DC&,C_Bitmap&)
~ReleaseDC(C_DC&)
~SetStretchBltMode(C_DC&,~COLORONCOLOR)
Desktop in DC blitten, es spielt kein Rolle, ob sich da ncoh Fenster befinden
Var Desktop& = GetDesktop()
External("user32.dll","PrintWindow",Desktop&,C_DC&,0)
und jetzt in Profanfenster
~StretchBlt(%hdc2,0,0,width(%hwnd),height(%hwnd),C_DC&,0,0,%maxx,%maxy,~srccopy)
Repaint
~DeleteObject(C_Bitmap&)
~DeleteDC(C_DC&)
Waitinput
End
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
06.10.2009  
 



Hehe nett, genau, ich hatte mir auch schon überlegt, die Fenster einfach sich zeichnen zu lassen bzw. die Zeichnung abzukopieren.

Ich kannte die user32s PrintWindow Funktion garnicht, einfach super Andreas!
 
06.10.2009  
 




Andreas
Miethe


iF, Beitrag=54398, Zeitpunkt=06.10.2009
Hehe nett, genau, ich hatte mir auch schon überlegt, die Fenster einfach sich zeichnen zu lassen bzw. die Zeichnung abzukopieren.

Ich kannte die user32s PrintWindow Funktion garnicht, einfach super Andreas!


Danke !

Und hier noch ein Beispiel für alle sichtbaren Fenster ohne das eigene. Sollte dann wohl das sein was da gesucht wurde ?
Vieleicht kann das Ganze noch ein wenig optimiert werden.
KompilierenMarkierenSeparieren
 $H Windows.ph
 $H Messages.ph
Struct RECT = left&,top&,right&,bottom&
cls

Proc GetDesktop

    Declare h&
    h& = ~FindWindow("Progman",0)
    h& = ~FindWindowEx(h&, 0, "SHELLDLL_DefView",0)
    h& = ~FindWindowEx(h&, 0, "Internet Explorer_Server",0)

    if h& > 0

        Return h&

    else

        h& = ~FindWindow("Progman",0)
        h& = ~FindWindowEx(h&, 0, "SHELLDLL_DefView",0)
        h& = ~FindWindowEx(h&, 0, "SysListView32",0)
        Return h&

    endif

EndProc

erstmal ein DC für den Bildschirm
Var C_DC& = ~CreateCompatibleDC(%hdc)
Var C_Bitmap& = ~CreateCompatibleBitmap(%hdc,%maxx,%maxy)
~SelectObject(C_DC&,C_Bitmap&)
~ReleaseDC(C_DC&)
~SetStretchBltMode(C_DC&,~COLORONCOLOR)
FensterArray anlegen
DECLARE Windows&[],Anzahl&
sichtbare Fenster durchnumerieren
~EnumWindows(ProcAddr("NumWins",2),0)
zusammenblitten
MakePicture()
und gestreckt ins Fenster
~StretchBlt(%hdc2,0,0,width(%hwnd),height(%hwnd),C_DC&,0,0,%maxx,%maxy,~srccopy)
Repaint
~DeleteObject(C_Bitmap&)
~DeleteDC(C_DC&)
Waitinput
End

Proc Numwins

    Fensterhandle in Array
    Parameters wnd&,lParam&
    das eigene Fenster ausnehmen

    If ~IsWindowVisible(Wnd&) And (Wnd& <> %hwnd)

        Windows&[Anzahl&] = wnd&
        Inc Anzahl&

    Endif

    Return 1

EndProc

Proc MakePicture

    zusammenblitten
    Var R# = New(Rect)
    Declare W&,H&,DC&,Bitmap&
    in umgekehrter Reihenfolge

    Whileloop Anzahl&-1,0,-1

        ~GetWindowRect(Windows&[&Loop],R#)
        W& = Int(R#.right&-R#.left&)
        H& = Int(R#.bottom&-R#.top&)
        DC& = ~CreateCompatibleDC(%hdc)
        Bitmap& = ~CreateCompatibleBitmap(%hdc,W&,H&)
        ~SelectObject(DC&,Bitmap&)
        ~ReleaseDC(DC&)
        External("user32.dll","PrintWindow",Windows&[&Loop],DC&,0)
        ~Bitblt(C_DC&,R#.left&,R#.top&,R#.Right,R#.bottom&,DC&,0,0,~srccopy)
        ~DeleteObject(Bitmap&)
        ~DeleteDC(DC&)

    Endwhile

    Dispose R#

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
06.10.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

15.305 Betrachtungen

Unbenanntvor 0 min.
Sven Bader09.03.2021
kustg11.12.2019
AndreasS17.12.2018
Wolfgang29.11.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie