Jag har hittat ett klassbibliotek som ska användas för att ta skärmdumpar av ett aktivt fönster. Det är skrivet i C# och jag undrar nu om det är någon som har lust att hjälpa mig förstå biblioteket. Jag skulle vilja använda det för att ta en fönsterdump av det fönstret som visas av en viss process vilken jag får genom GetProsessName. Jag har nedan postat sökvägen på Filarea till filen. Du kan ju faktiskt skicka upp koden i filarean och referera till denna via detta inlägg. På så sätt är det nog enklare för någon att kunna avgöra om de kan hjälpa dig eller åt minstone testa den kod du har och se om de kan lösa ditt problem. + du behöver inte skriva samma sak i flera olika inlägg med olika subjects... då blir det bara irriterande Andres igår (10) var det stul med forumet. Det är förmodligen det som genererat att samma inlägg kommit upp flera ggr. Man såg inte var man postade inlägget. Det stämmer Göran. Jag tror inte de andra två inläggen kom med efterssom de inte är inlagda i någon kattegori. Du och göran verkar sitta med antingen samma projekt eller samma typ av projekt. Göran har haft denna frågan uppe [Ett problem jag aaldrig verkar få svar på :-(] och den står numera löst, så göran kan förmodligen upplysa dig lite mer om detta. Det var kanske inte världens bästa sätt att ta en screenshot på.. Skulle också behöva printscreen-kod lite senare i mitt projekt...Skulle du ha tid över en regnig dag så är jag intresserad av kodexempel på hur man gör detta på det sätt du föreslår. här kommer ett quickndirty exempel. Tackar så mycket. du kan ta screenshots av vilket fönster du vill Ok jag försökte så här men är bara amatör så jag kanske är helt ute och cyklar. hmmm.. Kan detta hjälpa dig? Dock skriver i VB .Net :-( Finns det inget enkelt sätt att automatiskt konvertera VB.Net till C#? Borde väll finns något i Visual Studio tycker man? Hej. Här följer lite kod som tar en screenshot på hela skrivbordet: Skickar jag in Processens Handle: Efter massor med strul har jag äntligen knäckt skärmdumpsproblemet. Satte ihop ett exempel som dumpar fönster såväl som desktopen. Man kan skicka in en windows handle (hWnd) såväl som ett System.Windows.Forms.Form beroende på vad man har tillgång till. Snyggt jobbat Hultan. Är denna en optimal lösning vad det gäller snabbheten i skärmdumpen osv? :-) Att min kod skulle vara optimal tvivlar jag på, jag kan för lite om detta för att producera optimal kod :-) Problemet med screenshots är just att de tar resurser, så länge du inte skulle ha en superdator :-) Ungefär så jag ;) Liten kul grej på ett spel som polaren gjort. Jag behöver ju iofs inte ta så många skärmdumpar räcker med typ en per sek.Snälla lite mer hjälp så är det löst.
OBS iMaila inte utan svara på forumet.
MVH HenkeSv: En rolig fråga!!!
Sv: En rolig fråga!!!
/AndreasSv: En rolig fråga!!!
//Göran PSv: En rolig fråga!!!
Jag har nu postat klassbiblioteket Programarkivet:Klassbibliotek för div Windows opperationerSv: En rolig fråga!!!
---
<b>Andreas Håkansson
Student of Software Engineering</b>Sv: Hjälp med roligt klassbibliotek
läs om wm_print och wm_printclient istället.
då slipper man göra massa fula hack med topmost eller bry sig om en viss del av fönstret är utanför skärmen.
//RogerSv: Hjälp med roligt klassbibliotek
Sv: Hjälp med roligt klassbibliotek
www.compona.com/wmprint.zip
//RogerSv: Hjälp med roligt klassbibliotek
Men det verkar som om exemplet bara kan ta dumpar på det form som det körs i. Hade tänkt ta en dump på ett extern fönster, typ word, notepad. Hur kan detta exempel modifieras för att kunna göra det?
Är detta exempel optimerat för att ta skärmdumpar?
MVH HenkeSv: Hjälp med roligt klassbibliotek
det krävs bara att du skickar rätt hwnd till metoden som tar screenshotsen..
//RogerSv: Hjälp med roligt klassbibliotek
<code>
Process[] p = Process.GetProcessesByName("client");
GetScreenshot(p[0].MainWindowHandle.ToInt32());
</code>
Vad är det som är fel här?Sv: Hjälp med roligt klassbibliotek
jag kan ha fel , kollade bara att det gick att skicka wm_print till fönster i andra processer ...
men som du säger , det blir ingen screenshot när man gör det...
skummt är det iaf , eftersom man kan se i spy++ att fönstret verkligen försöker rita sig i hdc'n..
någon annan som har någon bra ide'?
nog måste väll en annan process få rita i en hdc?
Roger Johansson
Cornflakes coder and wannabeSv: Hjälp med roligt klassbibliotek
http://www.developerfusion.com/show/181/
//Johan NSv: Hjälp med roligt klassbibliotek
MVH GöranSv: Hjälp med roligt klassbibliotek
skulle gärna skriva all kod till dig så du får screen shots av skärmen att fungera.
Har dock inte tid just nu. Skall ut på sjön, (det är ju Stor sol över hela sverige idag.)
:-) Om du orkar vänta tills enare i kväll, om du inte hinner lösa det innan derss så kan jag nog hjälpa dig.
Ha en skön eftermiddag.
//Johan NSv: Hjälp med roligt klassbibliotek
<code>
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace ScreenShot
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Class1 j = new Class1();
Bitmap myBitmap = new Bitmap(800,600);
Graphics g = Graphics.FromImage(myBitmap);
for(int i=0;i<100;i++)
{
j.CopyDesktopRectangle(0,0,g,800,600);
myBitmap.Save(@"c:\temp\picCapt\mypic" + i +".bmp");
}
//
// TODO: Add code to start application here
//
}
IntPtr hWndDesktop;
void CopyDesktopRectangle(int left, int top, Graphics graphics,int width,int height)
{
IntPtr hDCPanel = graphics.GetHdc();
IntPtr hDCDesktop = GetDC(hWndDesktop);
StretchBlt(hDCPanel, 0, 0, width, height,hDCDesktop, left, top, width / 1, height / 1, SRCCOPY);
graphics.ReleaseHdc(hDCPanel);
ReleaseDC(hWndDesktop, hDCDesktop);
}
[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("User32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("Gdi32.dll")]
public static extern int StretchBlt
(
IntPtr hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int nHeightDest,
IntPtr hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
int dwRop
);
public const int SRCCOPY = 0x00CC0020;
}
}
</code>
Vad är det du bygger? Ett fuskprogram?
// Johan NSv: Hjälp med roligt klassbibliotek
<code>
Process[] p = Process.GetProcessesByName("winamp3");
...
IntPtr hDCDesktop = GetDC(p[0].MailWindowHandle);
...
</code>
Så får jag bara ut en bitmap där själva desktopne förskjutits.
Eftersom jag inte direkt är någon windows API programmerare så kan jag inte alla API:er i huvudet, och något har jag missat.
Vad jag tror är ialla fall att dessa metoder, den jag använder så som BitBlit skickar meddelanden till windows controllen (eller vad man skall kalla den? Windows Handler?)
Och detta går fint. Vill man göra samma sak så får man ev skicka meddelanden till dessa apps, så som Roggans kodexempel. Dock verkar det bara fungera på vissa app o inte alla. Varför vet jag inte då jag inte vet vad exakt alla inputs gör. Men jag antar att den skickar messtill någon fönster hanterare? och dessa kan man ju i princip bygga som man själv vill.
Längre än så här kommer jag inte just nu.
//Johan NSv: Hjälp med roligt klassbibliotek
Det finns även kod i exemplet för att enumerera alla öppna fönster, den koden har dock inte jag skrivit. Se filarean Programarkivet:Skärmdumpar i C# (screenshots)
Koden är skriven i C#, VS.Net 2003.Sv: Hjälp med roligt klassbibliotek
Stort tack från Henke LSv: Hjälp med roligt klassbibliotek
Vad jag är lite nyfiken på är varför processens handler inte fungerar? Någon som har en aning?
<code>
Process[] p = Process.GetProcessesByName("winamp3");
...
IntPtr hDCDesktop = GetDC(p[0].MailWindowHandle);
...
</code>
Märkte även en annan sak. Detta app slänger fram fönstret och tar ut dess bitmap, när man ex väljer ett spel, IE, Outlook, så fungerar det inte, den slänger fram processen men klarar inte ta någon screenshot på den. ? Men det är ett steg i rätt riktning.
//Johan NSv: Hjälp med roligt klassbibliotek
Jag hade en del problem på min maskin med formulär som tar lite tid att "aktivera"/rita om så jag la in en Sleep(200) = 0.2 sek vilket löste problemet på min maskin, men kanske behövs det mer? Jag testade inte på speciellt många applikationer...kanske kan man göra någon asynkron lösning (callback-historia) som väntar tills applikationen själv säger att den är klar...jag vet inte om det finns något stöd för detta i Windows...
Ett sätt att använda koden är ju att med en HotKey aktivera den när användaren själv väljer och då är det ju upp till användaren att invänta omritningen...
När det gäller din fråga om processen så har jag ingen aning...kan egentligen inte så mycket om Windows API:er och andra OS-nära prylar, men jag behövde verkligen Screenshot-koden så det var bara att bita ihop och köra på :-)Sv: Hjälp med roligt klassbibliotek
Om du måste bygga det du bygger så får du dra ner på antal screenshorts, minska dessa, kanske att man tar ett var 50:e hundradel eller en gång i secunden, då skall ju en ok dator typ PIII800+ kunna handskas med det relativt bra utan att kräva för mkt resurser. (Beror dock på vad det är som går i fronten, (det som säger åt windows att ta mest kräm av ens hårdvara, Ex Krävande spel.) Sänke upplösningen på skärmen ökar oxå prestandan.
Vad är det du bygger? Ett fuskprogram? som skall ta skärmdumpar på ett spel? sedan skall du leta upp pixlar som motsvarar fiendens färger och ange positioner vart de befinner sig?
//Johan NSv: Hjälp med roligt klassbibliotek