Warum print-Anzeige in einer Windows-Dienst zurück ein Schwarzes Bild?
protected override void OnStart(string[] args)
{
base.OnStart(args);
CaptureScreen();
}
protected override void OnStop()
{
base.OnStop();
}
private void CaptureScreen()
{
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
printscreen.Save(@"L:\" + Counter++ + ".jpg", ImageFormat.Jpeg);
}
- Ich überprüfte die Interaktion mit desktop
- versucht, das localService-Konto & user
- Welches Betriebssystem?
- Anmerkung: Ein service kann nicht wissen, über ein zugeordnetes L: - Laufwerk (in der Regel Benutzer-abhängig. Verwenden Sie einen UNC-Pfad (\\server\Pfad).
- L:\\ lokale Festplatte und das os ist win 7 64bit
- In Windows Vista und späteren Windows-Dienste können nicht die direkte Interaktion mit dem desktop. In der Tat, ein service ist nicht im Zusammenhang mit einer bestimmten Benutzer-desktop, so gibt es im wesentlichen nichts auf dem Bildschirm zu erfassen. Siehe meine Antwort hier für weitere details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein Teil der session-0-isolation-Funktion, die Hinzugefügt wurde, um Vista. Dienste laufen nun Ihrer eigenen Sitzung, mit Ihrer eigenen Arbeitsstation und desktop. Ähnlich wie die Sitzung, für die der login-prompt und Bildschirmschoner ausgeführt werden. Nehmen Sie einen screenshot der Sitzung der desktop, es gibt nichts in ihm. Für den Zugriff auf das Benutzer-desktop ist nicht mehr möglich. Es ist ein Sicherheits-feature, es verhindert, dass shatter-Angriffe. Zugegeben, ich verstehe nicht, warum die "Interaktion mit desktop" aktivieren nicht entfernt werden.
Müssen Sie ändern, um Ihr Programm laufen zu lassen, wie eine "windows-Anwendung", nicht um einen Dienst. Setzen Sie eine Verknüpfung in den Autostart-Ordner oder verwenden Sie die Run-Registrierungsschlüssel. Das ist okay, es ist nichts sehr viel Wert, das einrasten, wenn kein Benutzer angemeldet ist.
Müssen Sie Ihren Dienst für die Benutzer von windows entfernt. Das ist nicht mein code und ich kann mich nicht erinnern, wo ich das habe.
Fügen Sie diese zwei Klassen
dann erstellen Sie ein Desktop-Objekt
Desktop-userDesk = new Desktop();
Dann, wenn Sie müssen Ihren Dienst für die Interaktion mit der Benutzer-Sitzung, die Sie schreiben würde
userDesk.BeginInteraction();
und schließlich zurück zu Ihrem Dienst die Sitzung rufen Sie
userDesk.EndInteraction();
Der service ist "headless", kein UI und ohne 100% sicher (Die Dokumentation für die CopyFromScreen eher vage ist), würde ich erwarten, dass, um Fehler beim ausführen von headless. Wie würde der Dienst wissen, welche Bildschirm, um die Kopie in dem Fall, wo mehrere Benutzer angemeldet sind an der gleichen Zeit?
sehen diese Fragen sowie
Im Fall von XP/2003 die Interaktion mit Desktop sollte helfen.
Im Fall von Windows 7/Windows 2008 eine Interaktion mit Desktop funktioniert anders.
Die beste Lösung für Sie wäre, zu analysieren, logon-sessions aus dem Dienst und für die neue Sitzung starten Sie das "desktop" - Prozess in der user-Sitzung und die Kommunikation mit diesem Prozess, um Bildschirme.