.net - Screen capture med C # og Remote Desktop problemer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en C-skarp konsol-applikation, der optager et screenshot af et MS Word-dokument flere gange. Det virker godt, men når jeg placerer denne applikation på en ekstern Windows XP-maskine, virker det fint, mens jeg er fjernet, dvs. min fjernbetjening er synlig, men hvis jeg kører min app og forlader fjernbetjening (minimere det, ikke engang log som jeg vil gøre ) de skærmbilleder, det tager, er tomme!


Skærmbilledet app køres af en tjeneste, der kører som SYSTEM-bruger.


Hvordan kan jeg holde GUI i live for Windows, selv når der ikke er nogen brugere tilsluttet?


Her er koden jeg bruger:


public Image CaptureWindow(IntPtr handle)
{
    // get te hDC of the target window
    IntPtr hdcSrc = User32.GetWindowDC(handle);
    // get the size
    User32.RECT windowRect = new User32.RECT();
    User32.GetWindowRect(handle, ref windowRect);
    int width = windowRect.right - windowRect.left;
    int height = windowRect.bottom - windowRect.top;
    // create a device context we can copy to
    IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
    // create a bitmap we can copy it to,
    // using GetDeviceCaps to get the width/height
    IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
    // select the bitmap object
    IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
    // bitblt over
    GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
    // restore selection
    GDI32.SelectObject(hdcDest, hOld);
    // clean up 
    GDI32.DeleteDC(hdcDest);
    User32.ReleaseDC(handle, hdcSrc);

    // get a .NET image object for it
    Image img = Image.FromHbitmap(hBitmap);
    // free up the Bitmap object
    GDI32.DeleteObject(hBitmap);

    return img;
}


Opdater



Jeg bruger i øjeblikket PrintWindow, som er det eneste, der er kommet tættest, da det lykkes at fange vinduesrammen (dvs. minimere, maksimere og lukke knapper), men den indre del er sort.


Selvom det ikke har fungeret fuldt ud, viste det mig, at det er muligt at oprette et billede fra et vindueshåndtag, mens applikationen ikke er synlig for en bruger.

Bedste reference


For en tid siden gjorde vi noget lignende, og vi fandt ud af, at når RDC er minimeret, bliver den fjerntliggende desktop-session ikke omlagt eller accepteret nøgler eller mushændelser. Alt fungerede fint, indtil vi minimerede RDC-skærmen. En kollega fandt ud af, at dette er gjort for præstationsårsager.


For nogle dage siden snuble jeg på dette, men jeg har ikke haft chancen for at prøve det. Hvis du prøver det, så lad det mig vide :)


Interagerer med fjernbetjening, når RDC minimeres [2]


Med hensyn til dine kommentarer: Jeg synes, det er en anden slags problem ... Jeg forstår, at du har brug for din ansøgning til at fungere, selvom ingen er logget ind i maskinen. Jeg har implementeret tjenester, der har lov til at interagere med skrivebordet, for eksempel at starte en applikation og automatisere den. Selv ingen er logget ind i maskinen, du kan stadig manipulere brugergrænsefladen, f.eks. Med et UI-automatiseringsbibliotek ( eller din kode antager jeg).


Når jeg har startet maskinen, fungerer min service og automatiseret applikation fint. Senere vil brugergrænsefladen blive automatiseret på skrivebordet til den første person, der logger ind (jeg var maskinadministrator, jeg ved ikke, hvad der vil ske, når nogen med mindre privilegier logger ind).


Jeg ved ikke, hvad der vil ske, hvis det første login er gjort via RDC. Måske kan du prøve at ændre disse RDC-indstillinger id, der påvirker opførslen af ​​din ansøgning. En anden mulighed er:



  1. Deaktiver RDC og konfigurer windows til Autologin med en angivet konto

  2. Opret forbindelse til denne maskine ved hjælp af et andet eksternt desktopprogram (f.eks. TightVNC)



Hjælper dette?