2008-09-17 3 views
2

J'ai plusieurs applications qui font partie d'une suite d'outils que divers développeurs de notre studio utilisent. ces applications sont principalement des applications en ligne de commande qui ouvrent un shell cmd DOS. Ces applications lancent à leur tour une application graphique qui suit la sortie et l'état (via les sockets) de ces applications en ligne de commande. Les applications en ligne de commande peuvent être démarrées lorsque l'utilisateur est connecté, lorsque son poste de travail est verrouillé (il déclenche un fichier batch, puis verrouille immédiatement son poste de travail) et lorsqu'il est déconnecté (via une tâche planifiée) . Les problèmes que j'ai sont avec les deux derniers cas.Test des conditions d'exécution d'une application Windows

Si l'une de ces applications s'éteint lorsque l'utilisateur est verrouillé ou déconnecté, cette commande générera les fenêtres de l'interface graphique qui suivent la sortie/l'état. C'est bien, mais dites que l'utilisateur a verrouillé leur poste de travail - quand ils déverrouillent leur poste de travail, l'interface graphique n'est pas visible. Il exécute la liste des tâches, mais ce n'est pas visible. La prochaine fois que ces utilisateurs exécuteront certaines de nos applications en ligne de commande, l'interface graphique ne sera pas lancée (car elle est déjà en cours d'exécution), mais comme elle n'est pas visible sur le bureau, les utilisateurs ne verront aucune sortie. Ce que je cherche est un moyen de dire à partir de mes applications en ligne de commande si elles sont exécutées derrière un poste de travail verrouillé ou lorsqu'un utilisateur est déconnecté (via une tâche planifiée) - sont-ils en cours d'exécution sans le bureau d'un utilisateur visible. Si je peux le dire, je ne peux tout simplement pas démarrer notre interface graphique et éviter beaucoup de problèmes.

Ces applications que j'ai besoin de tester sont des applications Windows C/C++.

J'espère que cela a du sens.

Répondre

3

J'ai trouvé la réponse programmatique que je cherchais. Cela a à voir avec les stations. Apparemment, tout ce qui fonctionne sur le bureau fonctionnera sur une station avec un nom particulier. Tout ce qui n'est pas sur le bureau (c'est-à-dire un processus démarré par le gestionnaire de tâches lorsqu'il est déconnecté ou sur un poste de travail verrouillé) commencera avec un nom de station différent. Exemple de code:

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; 
    } 
} 

Si vous arrivez à l'intérieur du « si » la déclaration, votre processus n'est pas sur le bureau, mais en cours d'exécution « ailleurs ». J'ai regardé la valeur de namebuffer quand ne fonctionnant pas du bureau et les noms ne signifient pas beaucoup, mais ils ne sont pas WinSta0.

Lien vers les documents here.

1

Vous pouvez utiliser SENS (System Event Notification Services). Je ne l'ai jamais utilisé moi-même, mais je suis presque sûr qu'il fera ce que vous voulez: vous donner des notifications pour des événements comme la connexion, la déconnexion, l'économiseur d'écran, etc.

Je sais que c'est assez vague, mais j'espère vous avez commencé. Une recherche rapide google a révélé ceci, entre autres: http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

0

Je l'ai utilisé avec succès cette approche pour détecter si le bureau est verrouillé sous Windows:

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); 
} 
Questions connexes