2009-03-11 9 views
2

Ich schreibe einen C# -Dienst, der Informationen vom aktuell angemeldeten Benutzer wie das aktive Fenster oder die letzte Mausbewegung abrufen muss. Ich habe bereits gelernt, dass ich diese Informationen mithilfe der user32.dll abrufen kann, aber das funktioniert nur aus dem Benutzerkontext, der die Methoden aufruft.So erhalten Sie das aktive Fenster eines angemeldeten Benutzers von einem Dienst

Auf diese Weise konnte mein Dienst nur Informationen über sich selbst abrufen, aber nicht über den "echten" Benutzer. Ich habe auch gehört, dass dies mit WTSEnumerateSessions, OpenWindowStation, EnumDesktops usw. möglich sein sollte, aber ich habe kein Beispiel gefunden, das mir zeigt, wie das geht.

Hat jemand eine Ahnung (oder vielleicht einige Codebeispiele), wie ich mein Ziel erreichen kann?

Antwort

4

Das klingt wie ein Job für eine App, die in der Benutzersitzung ausgeführt wird. Ein wohlerzogener Dienst sollte nicht auf den Benutzer so herumschnüffeln. Dort kann Wege sein, es zu tun (ich weiß es ehrlich gesagt nicht), aber es klingt nicht sehr ... richtig.

Beachten Sie, dass bei neueren Windows-Versionen die Konsolensitzung (Sitzung 0) auf Verwaltungszwecke beschränkt ist und der Benutzer (normalerweise) nicht dort ist. Sie haben möglicherweise keine, eine oder viele Sitzungen ohne Konsole.

+0

In der Tat. Ich mag es auch nicht sehr, aber wenn die App in der Benutzersitzung läuft, kann der Benutzer sie abbrechen. Dies könnte verhindert werden, falls es als Dienst ausgeführt wird. – Marcus

+0

Lassen Sie den Dienst einfach die Anwendung neu starten. – Samuel

+0

Ich habe darüber nachgedacht, eine Benutzeranwendung und einen zusätzlichen Dienst zu erstellen, aber wie kann ein Dienst eine Anwendung in der Benutzersitzung neu starten, ohne die Anmeldeinformationen des Benutzers zu haben? – Marcus