| |
|
|
- Page 1 - |
|
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 Io l' Code gerne zur Verfügung |
|
|
| |
|
|
|
| |
|
- Page 1 - |
|
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 per 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
Di /a> 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 ▲ |
|
|
|
| |
|
- Page 2 - |
|
|
Dieter Zornow | Also bei funktioniert die Sache leider nicht so toll. Es wird ein ziemlich zerstörter Bildschirm hinterlassen, den ich mit beenden oder starten eines Programmi wieder herstellen muss. Auch die Taskleiste muss ich durch überfahren der Elemente wieder herstellen. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 07.10.2009 ▲ |
|
|
|
|
| Könntest Du vom Unheil einen Screenshot machen? |
|
|
| |
|
|
|
Andreas Miethe
| Dieter Zornow, Beitrag=54400, Zeitpunkt=07.10.2009
Also bei funktioniert die Sache leider nicht so toll. Es wird ein ziemlich zerstörter Bildschirm hinterlassen, den ich mit beenden oder starten eines Programmi wieder herstellen muss. Auch die Taskleiste muss ich durch überfahren der Elemente wieder herstellen.
Sieht so aus, dass einige System-Fenster von XP mit PrintWindow nicht klarkommen.Unter Vista klappt es ohne Probleme. Der Ansatz sollte aber richtig sein. Es muss halt noch ein gescheiter Filter per die System-Fenster rein. |
|
|
| 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 : [...] | 07.10.2009 ▲ |
|
|
|
|
Sven Bader | Der Ansatz ist sehr interessant. Ich befürchte leider, dass es an Stabilität und Geschwindigkeit mangelt. Mir ist folgendes aufgefallen:
XP: -Der Desktop wird immer schwarz dargestellt -Alle Fenster sind "zerstört" und müssen neugezeichnet werden
Vista: -Die rechte Metà des Desktops wird schwarz dargestellt -Fensterschatten werden nicht dargestellt |
|
|
| |
|
|
|
Andreas Miethe
| Sven Bader, Beitrag=54407, Zeitpunkt=08.10.2009
Der Ansatz ist sehr interessant. Ich befürchte leider, dass es an Stabilität und Geschwindigkeit mangelt. Mir ist folgendes aufgefallen:
XP: -Der Desktop wird immer schwarz dargestellt -Alle Fenster sind "zerstört" und müssen neugezeichnet werden
Vista: -Die rechte Metà des Desktops wird schwarz dargestellt -Fensterschatten werden nicht dargestellt
Hallo Sven, dann habe ich noch etwas Interessantes per Dich. Damit kannst Du auch freie Fensterformen machen. |
|
|
| 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 : [...] | 18.10.2009 ▲ |
|
|
|
|
Frank Abbing | Hat ReleaseDC() nicht zwei Parameter? |
|
|
| |
|
|
|
| Klar 2 [...] . Was mich immer wieder daran erinnert, dass unsere HeaderFiles leider keine Parameterdefinitionen beinhalten sodass man nicht automatisch überprüfen lassen kann. |
|
|
| |
|
|
|
Andreas Miethe
| Hallo zusammen, das Ganze ist eigentlich sehr einfach, wenn man es denn weiss. BitBlt ignoriert Layered-Windows. Also das Fenster einfach layered machen und schon geht der Screenshot ohne das Fenster.
@Frank, Du liest ja hier mit, das betrifft auch Dein Shooter-Tool, Willst Du damit auch Layered-Windows einfangen dann muss der Bitblt-Flag um ~CAPTUREBLT erweitert werden. KompilierenMarkierenSeparieren $H Windows.ph
window %maxx/4,%maxy/4-%maxx/2,%maxy/2
SetStyle %Hwnd,1, GetStyle(%hwnd,1) | $80000
External("User32.dll","SetLayeredWindowAttributes",%hwnd,0,255,2)
waitinput
Var ScreenDC& = ~CreateDC("DISPLAY",0,0,0)
Var NB& =Create("hNewPic",%maxx,%maxy,0)
Startpaint nb&
~BitBlt(%hdc,0,0,%maxx,%maxy,ScreenDC&,0,0,~srccopy)
EndPaint
~DeleteDC(ScreenDC&)
DrawSizedPic NB&,0,0-width(%hwnd),Height(%hwnd);0
waitinput
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 : [...] | 25.10.2009 ▲ | |
|
|
|
|
Frank Abbing |
@Frank, Du liest ja hier mit, das betrifft auch Dein Shooter-Tool, Willst Du damit auch Layered-Windows einfangen dann muss der Bitblt-Flag um ~CAPTUREBLT erweitert werden.
Danke per den Hinweis! Bin in den letzten Tagen auch auf den Flag gestossen, ist wirklich interessant. Schau mal, hier verwende ich ihn erstmals: [...] |
|
|
| |
|
|
|
Andreas Miethe
| Habe ich verfolgt, sehr interessant.
Mit ist es aufgefallen bei meinem Screenshot-Tool und meiner neuen Desktopuhr ( ist noch im Betastadium ), die wurde auch nicht eingefangen. |
|
|
| 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 : [...] | 25.10.2009 ▲ |
|
|
|
|
Frank Abbing | Werde bei Gelegenheit ändern, wenn Io l' Shooter-Code wieder offen hab. |
|
|
| |
|
|