2016-06-10 3 views
0

Meine Windows-App kann vom Benutzer oder per Autostart (Registrierung, 'Software \ Microsoft \ Windows \ CurrentVersion \ Run') gestartet werden.Bestimmen Sie, wie die App gestartet wurde - durch Benutzer oder durch automatisches Starten

Ist es möglich zu bestimmen, wie meine App gestartet wurde?

Die einzige Möglichkeit, die ich gefunden habe - Befehlszeilenparameter hinzufügen. Etwas wie myapp.exe -auto und myapp.exe -user. Ist es möglich, Befehlszeilenparameter zu vermeiden?

+1

Gibt es einen besonderen Grund, warum Sie Befehlszeilenargumente vermeiden möchten?Ich kann mir keinen saubereren Weg vorstellen, um das zu tun, was du verlangst. –

+0

Sie sollten die Einrichtung haben, die Ihre Anwendung startet * sagen Sie * es ist getan; Eine Befehlszeile ist dafür die beste Option. Sie würden sich wahrscheinlich nicht mit "-user" beschäftigen und annehmen, dass es, wenn es keine Befehlszeile gibt, manuell von der Shell gestartet wurde. –

+1

Verwenden Sie Befehlszeilenparameter. Was ist an einem System, das bekanntermaßen funktioniert, nicht zu mögen? –

Antwort

1

Der saubersten Ansatz ist es, einen Befehlszeilenparameter zu verwenden, die Sie auf dem Weg sind in dem Schlüssel Run Registry angegeben. Natürlich gibt es nichts, was den Benutzer daran hindern könnte, die App manuell mit demselben Befehlszeilenparameter auszuführen.

Eine andere Option besteht darin, einen Launcher zu erstellen, der die Hauptanwendung ausführt. Erstellen Sie entweder eine Launcher-App, die von der Registrierung ausgeführt wird, oder einen Launcher-Dienst, der automatisch mit Windows startet und die Haupt-App startet, wenn sich ein Benutzer anmeldet. Dann können Sie alle Dinge tun, damit die Haupt-App erkennt, wann sie ausgeführt wird der Launcher:

  1. Machen die beiden miteinander kommunizieren mit Rohren, Fenstermeldungen usw.

  2. Haben die Trägerrakete passieren einen geheimen Wert im STARTUPINFO::lpReserved oder STARTUPINFO::lpReserved2 Feld, wenn CreateProcess() Aufruf (siehe this article für weitere Details).

  3. Lassen Sie die Hauptanwendung überprüfen, ob ihre Elternprozess-ID die ausführbare Startprogramm ist (und ja, dort IST ein Konzept eines übergeordneten Prozesses in Windows). Siehe CreateToolhelp32Snapshot() und Process32First()/Process32Next(). Die PROCESSENTRY32 Struktur hat ein th32ParentProcessID Feld. Sie können den Dateinamen für diese Prozess-ID extrahieren.

  4. Lassen Sie den Launcher ein Kernel-Objekt erstellen, das launched process can inherit.

  5. etc, etc, etc.

Aber auch hier gibt es nichts, um den Benutzer zu verhindern, nur den Launcher manuell ausgeführt wird, oder einen Launcher Service zu töten und einen neuen Starter App zu schreiben, das Original zu imitieren Verhalten.

Am besten bleiben Sie einfach mit dem Befehlszeilenparameter und sorgen Sie sich nicht um Benutzer, die versuchen, es zu fälschen. Einfache Benutzer werden wahrscheinlich nicht einmal von der Registrierung oder der Befehlszeile wissen, und erfahrene Benutzer werden sie wahrscheinlich ignorieren. Böswillige Benutzer werden wahrscheinlich herausfinden, wie Sie Ihre Erkennungen umgehen oder sie einfach deaktivieren/ersetzen können.

+0

Es ist schade, dass wir nicht das Flag "Von Windows über eine Zeichenfolge aus der Registry gestartet" haben ... –

+1

Die einzige Möglichkeit, Informationen direkt an einen beliebigen gestarteten Prozess zu übergeben, sind Kommandozeilenparameter und die 'STARTUPINFO' Struktur . Sie möchten die Befehlszeile nicht verwenden. Microsoft könnte ein neues Flag in 'STARTUPINFO.dwFlags' definieren, nehme ich an, aber derzeit nicht. Ein benutzerdefiniertes Startprogramm kann [geheime Daten] (http://www.catch22.net/tuts/undocumented-createprocess) in "STARTUPINFO" verbergen, wenn der gestartete Prozess weiß, wo er danach suchen soll. –

0

Ich stimme mit Mohammed überein - eine Befehlszeilenflagge scheint die einfachste, erweiterbarste Art zu sein, das zu tun, was Sie tun.

Allerdings habe ich eine andere Idee (nur zum Spaß, ich bin immer noch für cmd args): Sie können ein anderes Programm in der Registrierung registrieren, die was auch immer Sie möchten anders machen und nur als es die ausführen wird ursprüngliches Programm. Wie ein Registry-Bootstrapper.

+0

Beachten Sie, dass keine der beiden Lösungen garantiert wie vorgesehen funktioniert. Ein Benutzer könnte die Anwendung über die Befehlszeile * "automatisch gestartet" * oder über die Launcher-App starten und sich so verhalten, als wäre dies kein vom Benutzer initiierter Start. – IInspectable

+1

Nun, wenn der Benutzer böse sein will, ist er willkommen, das zu tun. –

+0

Lässt CreateProcess Dinge nicht basierend auf dem Dateiinhalt starten, während shellexecute basierend auf der Erweiterung ausgeführt wird? Wenn also die registrierte Run-Anwendung keine ausführbare Erweiterung hatte, würde sie automatisch starten, aber der Benutzer konnte sie nicht ausführen. –

Verwandte Themen