2010-02-01 3 views
1

Je souhaite recevoir une notification dans mon application C++ lorsqu'un économiseur d'écran est sur le point de démarrer. J'ai essayé d'écouter WM_SYSCOMMAND messages avec wParam == SC_SCREENSAVE qui some people think should do the trick. Cela n'a pas fonctionné. Spy ++ a même montré que ma fenêtre n'a pas reçu de message WM_SYSCOMMAND. Chose intéressante est quand j'ai éteint le moniteur, j'ai reçu le message avec wParam == SC_MONITORPOWER. Est-ce que je comprends mal? Ou ai-je juste manqué quelque chose? Edit: Pour tester, j'ai utilisé l'économiseur d'écran Windows par défaut (celui avec le logo Windows).Recevoir une notification d'économiseur d'écran

+0

Pour les tests, avez-vous un ensemble économiseur d'écran réelle, ou est-il juste un écran noir? –

Répondre

1

Il semble que je ne reçois le message SC_SCREENSAVE que lorsque ma fenêtre est active. Le moyen de contourner cela est de définir global hook. Cela m'obligerait à put the callback function in a separate DLL et il y a aussi ce message effrayant sur les hooks qui ralentissent le système, j'ai donc décidé de laisser tomber l'idée de répondre au démarrage de l'économiseur d'écran.

0

Ceci est une tâche relativement complexe (bien que ce serait bien si c'était facile).

Certains de ces tests que vous trouverez en ligne ne fonctionnent que si votre fenêtre est mise au point. S'il s'exécute en arrière-plan, il risque de ne pas recevoir de tels messages. D'autres tests reposent sur un programme d'économiseur d'écran en cours d'exécution (vérifiez l'économiseur d'écran actuel, puis regardez la liste des processus pour voir si elle est active) mais ne fonctionnent pas si vous passez en mode powersave ou si votre économiseur d'écran est noir écran (c.-à-d. pas de programme, juste surveiller).

Je ne crois pas qu'il existe un moyen idéal de le faire. Vous voudrez peut-être revenir au début et réfléchir plus attentivement aux raisons pour lesquelles vous devez détecter cet état et ce que vous essayez d'accomplir. Vous pourriez avoir besoin d'une solution différente.

+0

Je souhaite informer l'utilisateur de manière discrète. Mon idée était de l'afficher lorsque l'économiseur d'écran démarre ou que le moniteur s'allume. De cette façon, je ne vais pas interrompre quoi que ce soit. – MMx

0

Probablement ma réponse arrive trop tard.

Le MSDN gère les écrans de veille sous "Legacy". Sur un ordinateur portable, ils gaspillent la batterie et sur un PC, ils sont également inutiles. Il est préférable d'éteindre le moniteur plutôt que d'afficher un économiseur d'écran.

Comme vous n'expliquez pas exactement ce que vous voulez faire, je ne sais pas si vous avez vraiment besoin de la notification AVANT que l'économiseur démarre ou s'il suffit d'être averti quand il a déjà commencé.

Dans ce dernier cas, c'est facile. Écrire un fil qui vérifie périodiquement:

BOOL b_SaverRunning; 
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0); 
Questions connexes