Jag är ute efter att kunna skapa en skärmdump från servern med hjälp av ASP .NET, antingen i C# eller VB .NET, går det? Hej, Ja det går... Du vill helt enkelt att man tar en skämdump av serverns skärm? Tackar för svaret, ska testa det genast. Varför jag vill kunna ta en skärmdump av serverns skärm är en enkel fråga, jag ska köra detta på min hemma dator, och när hela sidan är färdig ska den ha en vnc liknande funktion. I skolan har vi bara tillgång till port 21 och 80 utåt så av den anledningen kan jag inte använda en vanlig vnc server. du kan inte ta en skärmdump från asp.net processen Du kan med kod låta dig bli en anann användare och på den vägen förhoppningsvis få tag i bilden. Dock måste du (om jag inte minns fel) vara inloggad hemma med denna användare. Fast om det bara ärn vnc du vill nyttja kan du skapa upp en proxy på din sida som tar emot en rad protocoll via port 80 och ger dig sedan rätt protokoll tillbaka. Finns sådana apps att ladda hem. Finns även Vnc apps som går via port 80. Det skulle kunna vara något, om jag inte redan använde port 21 och 80, men tack ändå. Kör en service på ditt vanliga konto som du sedan via remoting eller nå't kan komma åt ifrån din asp.net app. Servicen snurrar på din vanliga användare och kan dra skärmdumpar. Det borde fungera tror jag jo, men han får då problemet att han redan använder port 21 och 80. Antar att dessa är den enda öppna? det kommer att kräva att du alltid har en användare inloggad på servern dock. Det är enda sättet att få tag i en desktop Svarade du på mig nu? eller onkel....? Skärmdump i ASP .NET
Har testat med följande kodsnutt men får bara en grå bild:
<code>
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
Graphics g1 = Graphics.FromHdc(dc1);
Bitmap MyImage = new Bitmap(1280, 960, g1);
Graphics g2 = Graphics.FromImage(MyImage);
Visible = false;
dc1 = g1.GetHdc();
IntPtr dc2 = g2.GetHdc();
BitBlt(dc2, 0, 0, 1280, 960, dc1, 0, 0, 13369376);
g1.ReleaseHdc(dc1);
g2.ReleaseHdc(dc2);
MyImage.Save(@"c:\Captured.png", ImageFormat.Png);
</code>Sv: Skärmdump i ASP .NET
Vågar man fråga varför? då servern skall ha så lite processer igång som möjligt bör ju skrivbordet alltid vara tomt :-)
Du får använda dig av Gdi32.dll apierna m.m. för att kunna utföra just detta.
Här har du ett exempel som jag slängt ihop, OBS! Jag använder mig här av StretchBlt() vilket gör att jag kan Zooma det parti jag vill ha ut. Vad jag även gör är att jag plockar ut Messenger processen, tar redan på dess position och tar en bild innom det området, Då måste messenger ligga överst på skrivbordet för att det skall fungera, har du fönster ivägen kommer detta med i din sacreenshot. Man kan ävenskckadddade till de lika rocessernaochfåut endt ders grafik utan att thänsyn till att de måte ligga verst på skrivbordet, detta är då en mer avancerad process, vilket jag inte har med i mitt exempel. (All grafik går heller inte att få tag i)
<code>
class Class1
{
[StructLayout(LayoutKind.Sequential)]
public struct APIRect
{
internal int left;
internal int top;
internal int right;
internal int bottom;
internal int Width
{
get{return right-left;}
}
internal int Height
{
get{return bottom-top;}
}
}
[DllImport("Kernel32.dll")]
public static extern void Sleep(int dwMilliseconds);
[DllImport("user32.DLL")]
public static extern IntPtr GetWindowRect(IntPtr hWND,ref APIRect Rect);
[DllImport("User32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("Gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("User32.dll", SetLastError=true)]
public static extern IntPtr GetWindowDC(IntPtr WindowHandle);
[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 void GetScreenShot (IntPtr hWnd)
{
APIRect rec=new APIRect();
GetWindowRect(hWnd,ref rec);
Bitmap b=new Bitmap(rec.Width ,rec.Height);
Graphics g=Graphics.FromImage(b);
IntPtr hDCDesktop = GetWindowDC(hWnd);//CreatCompatibleDC(hWnd);
IntPtr hdc= g.GetHdc();
Sleep(5000);
StretchBlt(hdc, 0, 0,rec.Width,rec.Height,hDCDesktop,0,0,rec.Width / 1,rec.Height / 1, 0x00CC0020);
g.ReleaseHdc(hdc);
ReleaseDC(hWnd, hDCDesktop);
b.Save(@"c:\temp\mypic.bmp");
}
[STAThread]
static void Main(string[] args)
{
Process[] p = Process.GetProcessesByName("msnmsgr");
Class1 j = new Class1();
Console.WriteLine(p[0].MainWindowTitle);
/*
StreamReader myStreamReader = p[0].StandardOutput;
// Read the standard output of the spawned process.
string myString = myStreamReader.ReadLine();
Console.WriteLine(myString);
Console.ReadLine();
*/
j.GetScreenShot(p[0].MainWindowHandle);
}
}
</code>
Mvh JohanSv: Skärmdump i ASP .NET
Sv: Skärmdump i ASP .NET
asp.net processen har ingen desktop igång i sin session. Att komma åt någon annan användares desktop är nog inte bara lite mekkigt.Sv: Skärmdump i ASP .NET
Mvh JohanSv: Skärmdump i ASP .NET
mvh JohanSv: Skärmdump i ASP .NET
Sv: Skärmdump i ASP .NET
Sv: Skärmdump i ASP .NET
Om inte så varför inte köra ett gratis vnc program?
Det jag även talade om skiter i om du använder port 21 eller 80. Ett sådant proxy program ger dig alla den info du behöver via port 80 och sedan fördelar den datan till de apps vars kommande protokoll tillhör. Port 80 är inget protokoll så att Http går via den är bara en standard. Du kan skicka in Http, Ftp, Msgn etc rakt in i port 80 och få lyssnaren att skicka datan dit du vill, på så vis kan alla program kommunicera via port 80 mot denna lyssnare som aggerar proxy och skickar datan dit den hör hemma. Många som kör så för att kunna komma åt resurser som normalt skulle kräva andra portar pga effektivitet.
Mvh JohanSv: Skärmdump i ASP .NET
Sv: Skärmdump i ASP .NET
För att sätta upp en proxyhanterare som tar in olika prot. via en port behöver ingen användare inloggad. Och vnc appet loggar ju in dig så for den får en request.
Mvh Johan