GUI-Anwendung hervorgebracht von einem lokalen System Service (via CreateProcessAsUser) nicht im Fokus

StackOverflow https://stackoverflow.com/questions/860428

Frage

Ich habe einen Dienst geschaffen, die auf dem Desktop eines bestimmten Benutzers eine Art Begrüßungsbildschirm angezeigt werden und nur dann, wenn dieser Benutzer in (Kiosk Benutzern) angemeldet.

Das Splash-Screen, sobald ein gültiger Code eingegeben, wird das sagen zu dem Dienst und der Service geht für eine x Höhe der Zeit zu schlafen (abhängig von dem Code).

Die Splash-Screen einfach beendet. Nun, wenn der Dienst wacht er sieht, dass die Spritzen nicht mehr da sind und es so starten.

Das alles funktioniert, das einzige Problem ist, dass die gestartete Anwendung des Fokus nicht besitzt, das heißt, wenn ich im Notizblock arbeitete und die Zeit abgelaufen ist, wird die Splash-Screen (Vollbild though) hinter Notizblock angezeigt.

Ich muß nur über Windows Vista Sorge, ich bin Codierung in Python win32-Erweiterungen verwenden, aber ich glaube, dass dieses Problem in CreateProcessAsUser liegt, wenn sie aus dem lokalen Systemkonto genannt.


Update:

Das ‚Problem‘ ist eigentlich ein absichtlich Einschränkung ‚irritierend‘ Anwendungen wie meins, um zu verhindern Fokus zu stehlen.

Sie können das Verhalten ändern, indem Sie: win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) das entspricht in vorübergehend den Registrierungswert einstellen: HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout Dies muss als Benutzer erfolgen selbst, also entweder bauen sie in der Anwendung, die Sie starten oder einen Starthelfer für die Anwendung, die Sie starten möchten bauen.

Allerdings könnte eine Anwendung will, dass es den Fokus zu verhindern, indem sie mit einigem API-Aufruf gestohlen bekommen, die ich erinnere mich nicht, gerade jetzt.

Eine wahrscheinlich gute Lösung wäre, alle Fenster finden Griffe zur Zeit von diesem Benutzer und dann jede dieser Griffe verwenden win32gui.ShowWindow zu verwenden (handelte, Befehl) es zu minimieren.

Obwohl für dieses spezielle Problem Einstellung der locktimeout Einstellung war genug.

Wenn jemand fragt, wie ich es geschafft, eine Anwendung auf einem Desktop von einem Dienst zu starten, ist hier ein Link zu dem Code .

War es hilfreich?

Lösung 2

Für verschiedene sehr legitimierten Gründe Microsoft würde lieber keinen Dienst sieht eine App starten und den Fokus zu stehlen, aber ich fand die folgende Arbeit um noch zu erreichen, was ich will.

Die ursprüngliche Absicht ist es, einen Kiosk, wie Anwendung, die von einem Passcode wie Splash Screen behindert zu haben, die einen 8-Zeichencode beim Eintritt definiert, um den Startbildschirm für die Dauer der Zeit, wie in dem Durchlaufcode schließen. Ursprünglich war die tatsächliche Anwendung auf die Verwendung durch den Autostart-Ordner gestartet wurde.

Allerdings schrieb ich es jetzt, dass es von meinem Dienst, auf diese Weise gestartet wird, ich durch die Einführung eine Hilfsanwendung aus dem Dienst die Anwendung verstecken kann, die nur das Programm versteckt und starten den Splash-Screen, beim Verlassen des Splash-Screen ist das Programm wieder in den vorherigen Zustand zurück.

Andere Tipps

Haben Sie versucht, eine andere Prozesse als die eigene aus dem Dienst starten, um zu sehen, wenn es den Fokus erhält? Wie Notizblock und sehen, ob es den Fokus von Ihrem Browser stiehlt? Wenn ja vielleicht sein das Programm, das den Fokus zurücknehmen kann, wenn es gestartet wird.

ich sonst beilive es ist das wShowWindow Attribut aus der STARTUP die lpStartupInfo Punkte dieser Struktur sollte es kontrollieren. Sie müssen auch STARTF_USESHOWWINDOW in dwFlags nShowWindow verwenden. Die Werte sollten SW_SHOW ich denke, sie für die Showwindow-Funktion aufgeführt sind, wenn Sie andere versuchen wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top