2008-09-17 6 views
2

Ich habe mehrere Anwendungen, die Teil einer Reihe von Tools sind, die verschiedene Entwickler in unserem Studio verwenden. Diese Anwendungen sind hauptsächlich Befehlszeilen-Apps, die eine DOS-cmd-Shell öffnen. Diese Apps wiederum starten eine GUI-Anwendung, die Ausgabe und Status (über Sockets) dieser Befehlszeilen-Apps verfolgt.Test laufender Zustand einer Windows-Anwendung

Die Befehlszeilen-Apps können mit dem angemeldeten Benutzer gestartet werden, wenn ihre Arbeitsstation gesperrt ist (sie starten eine Stapeldatei und sperren sofort ihre Arbeitsstation) und wenn sie abgemeldet werden (über eine geplante Aufgabe) . Die Probleme, die ich habe, sind mit den letzten beiden Fällen.

Wenn eine dieser Anwendungen ausgelöst wird, wenn der Benutzer gesperrt oder abgemeldet ist, werden mit diesen Befehlen die GUI-Fenster erzeugt, die die Ausgabe/den Status verfolgen. Das ist in Ordnung, aber sagen Sie, dass der Benutzer seine Arbeitsstation gesperrt hat - wenn sie ihre Arbeitsstation entsperren, ist die GUI nicht sichtbar. Es läuft die Aufgabenliste, aber es ist nicht sichtbar. Wenn diese Benutzer das nächste Mal einige unserer Befehlszeilen-Apps ausführen, wird die GUI nicht gestartet (weil sie bereits ausgeführt wird). Da sie jedoch nicht auf dem Desktop angezeigt wird, sehen Benutzer keine Ausgabe. Ich suche nach einer Möglichkeit, von meinen Befehlszeilen-Apps zu unterscheiden, wenn sie hinter einer gesperrten Workstation laufen oder wenn ein Benutzer ausgeloggt ist (über geplante Aufgabe) - im Grunde läuft er ohne den Desktop eines Benutzers sichtbar. Wenn ich das sagen kann, kann ich einfach unsere GUI nicht starten und viele Probleme verhindern.

Diese Apps, die ich testen muss, sind C/C++ Windows-Anwendungen.

Ich hoffe, dass dies sinnvoll ist.

Antwort

3

Ich fand die programmatische Antwort, die ich suchte. Es hat mit Stationen zu tun. Offensichtlich läuft alles, was auf dem Desktop läuft, auf einer Station mit einem bestimmten Namen. Alles, was sich nicht auf dem Desktop befindet (d. H. Ein Prozess, der vom Task-Manager beim Abmelden oder auf einer gesperrten Workstation gestartet wird) wird mit einem anderen Stationsnamen gestartet. 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 ist nicht auf dem Desktop, sondern läuft „woanders“. Ich habe mir den Namenspufferwert angeschaut, wenn er nicht vom Desktop aus läuft, und die Namen bedeuten nicht viel, aber sie sind nicht WinSta0.

Link zur Dokumentation here.

1

Möglicherweise können Sie SENS (System Event Notification Services) verwenden. Ich habe es selbst nie benutzt, aber ich bin fast sicher, es wird tun, was Sie wollen: Benachrichtigung über Ereignisse wie Anmelden, Abmelden, Bildschirmschoner, usw.

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

0

ich diesen Ansatz erfolgreich verwendet haben, um festzustellen, 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); 
}