Frage

Ich habe mehrere Anwendungen, die Teil einer Reihe von Tools, die verschiedene Entwickler bei uns im Studio verwendet werden. gebieten diese Anwendungen werden hauptsächlich Linie Anwendungen, die eine DOS cmd Shell öffnen. Diese Anwendungen wiederum starten eine GUI-Anwendung, die Ausgabe und Status (über Sockets) diese Befehlszeile Anwendungen aufspürt.

Die Befehlszeile Anwendungen können mit dem Benutzer gestartet werden, wird angemeldet, wenn ihr Arbeitsplatz gesperrt ist (sie eine Batch-Datei abfeuern und dann sofort ihre workstaion sperren), und wenn sie angemeldet sind aus (über eine geplante Aufgabe). Die Probleme, die ich habe, sind mit den letzten beiden Fällen.

Wenn eine dieser Anwendungen abfeuern, wenn der Benutzer gesperrt oder abgemeldet, diese Befehl wird die GUI-Fenster erzeugen, die den Ausgang / Status verfolgt. Das ist in Ordnung, aber sagt, dass der Benutzer hat ihre Arbeitsstation gesperrt - wenn sie ihre Arbeitsstation zu entsperren, die GUI nicht sichtbar ist. Es läuft die Aufgabenliste, aber es ist nicht sichtbar. Das nächste Mal, wenn diese Benutzer einige unserer Befehlszeilen Anwendungen ausführen, wird das GUI nicht gestartet bekommen (weil es bereits ausgeführt wird), sondern weil es auf dem Desktop nicht sichtbar ist, Benutzer sieht keine Ausgabe.

Was ich suche ist ein Weg von meinem Kommandozeile zu sagen, apps, wenn sie hinter einer verschlossenen Workstation ausgeführt wird oder wenn ein Benutzer abgemeldet ist (über geplante Task) - im Grunde laufen sie ohne einen Desktop des Benutzers sichtbar . Wenn ich das sagen kann, dann kann ich einfach nicht unsere GUI starten und eine Menge Probleme verhindern kann.

Diese Anwendungen, die ich brauche zu testen, sind C / C ++ Windows-Anwendungen.

Ich hoffe, dass das sinnvoll.

War es hilfreich?

Lösung

Ich fand die programmatische Antwort, die ich suchte. Es hat mit Stationen zu tun. Scheinbar alles auf dem Desktop ausgeführt wird mit einem bestimmten Namen auf eine Station laufen. Alles, was nicht auf dem Desktop (das heißt ein Prozess, durch den Task-Manager gestartet, wenn abgemeldet oder auf einem gesperrtes Workstation) ist mit einem anderen Sendernamen beginnen. Beispielcode:

HWINSTA dHandle = GetProcessWindowStation();
if ( GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded) ) {
    if ( stricmp(nameBuffer, "winsta0") ) {
        // when we get here, we are not running on the real desktop
        return false;
   }
}

Wenn Sie in der ‚if‘ Anweisung bekommen, dann ist Ihr Prozess nicht auf dem Desktop, sondern „irgendwo anders“ läuft. Ich schaute auf dem namebuffer Wert, wenn sie nicht aus dem Desktop ausgeführt werden und die Namen bedeuten nicht viel, aber sie sind nicht WinSta0.

Link zu den docs hier .

Andere Tipps

Möglicherweise können Sie SENS (System Event Notification Service) verwenden. Ich habe es selbst nie benutzt, aber ich bin fast sicher, es wird tun, was Sie wollen. Geben Sie eine Benachrichtigung für Ereignisse wie Anmeldung, Abmeldung, Bildschirmschoner, etc.

Ich weiß, das ist ziemlich vage, aber hoffentlich wird es, Ihnen den Start. Eine schnelle Google-Suche aufgedreht dies unter anderem: http: //discoveringdotnet.alexeyev .org / 2008/02 / sens-events.html

Ich habe erfolgreich verwendet, diesen Ansatz zu erkennen, ob der Desktop auf Windows gesperrt ist:

bool isDesktopLocked = false;
HDESK inputDesktop = OpenInputDesktop(0, FALSE,
             DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
             DESKTOP_ENUMERATE |  DESKTOP_SWITCHDESKTOP |
             DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
             DESKTOP_WRITE);

if (NULL == inputDesktop)
{
    isDesktopLocked = true;
}
else
{
    CloseDesktop(inputDesktop);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top