Par programme empêcher l'économiseur d'écran Windows de démarrer
Est-il recommandé de façon à empêcher l'économiseur d'écran Windows de démarrer? La chose la plus proche que j'ai trouvé est cet article, mais ce que je voudrais vraiment faire, c'est juste dire à Windows que l'ordinateur n'est pas inactif plutôt que de le tromper avec l'ensemble de l'économiseur d'écran des valeurs.
- ...avez-vous aussi besoin de désactiver le système et/ou de l'écran d'aller dormir? Il a été un certain temps depuis que j'ai vu un économiseur d'écran sur mon écran. (Le sommeil semble beaucoup plus probable.)
- hey, merci pour l'idée; il n'a jamais eu lieu pour moi qu'un delta de 0,0 pourrait fonctionner. J'ai ajouté que l'option "Zen se trémousser" à 1,2 (en laissant l'original aussi, pour ces gens qui deviennent nerveux quand ils ne peuvent pas réellement voir de travail).
Vous devez vous connecter pour publier un commentaire.
Pour les tests, je régler l'économiseur d'écran à 1 minute et nécessite un mot de passe.
J'ai essayé de prendre SC_SCREENSAVE et retournent -1 en VB .Net. Comme le faisait remarquer, il fonctionne quand il n'y a pas d'économiseur d'écran de mot de passe mais échoue si l'économiseur d'écran mot de passe est actif. (Je l'ai essayé sous Windows XP). J'ai aussi mis dans un Timer tick événement, toutes les 1000 millisecondes:
Il ne fonctionne pas. Le curseur bouge d'avant en arrière et après 1 minute, l'écran de veille clignote sur pour une courte durée, puis s'éteint. L'économiseur d'écran s'allume pour l'instant, pas assez longtemps pour exiger un mot de passe. Mais encore, le flash est laid.
Puis j'ai essayé d'utiliser user32.dll's SetCursorPos et GetCursorPos. Vous pouvez les regarder à pinvoke. Même résultat que ci-dessus.
Puis j'ai jeté un coup d'oeil au code de "JiggleMouse" mentionnés ailleurs dans la présente question. JiggleMouse utilise SendInput. SendInput fonctionne! Pas de flash de l'économiseur d'écran. J'ai mis un appel à SendInput à l'intérieur d'un Timer qui déclenche toutes les 50 secondes (un peu moins que le minimum de l'économiseur d'écran le délai d'attente de 60 secondes). Il suffit de passer la souris par un delta de 0,0, pas de mouvement réel. Que ne travail. Le code à mettre dans l'événement Tick:
Cela vient de pinvoke.com:
SystemParametersInfo
Plus précisément, le
SPI_SETSCREENSAVEACTIVE
paramètre.N'est-ce pas le travail? J'ai été surpris que je n'ai pas les voir ici. Notez que SetThreadExecutionState n'affectera pas l'économiseur d'écran, juste le sommeil de l'écran.
Subtile. Officiel pour dire à Windows que le système n'est pas inactif est SetThreadExecutionState. Cela réinitialise le minuteur d'inactivité, (ou l'éteint, si vous passez
ES_CONTINUOUS
). Cependant, même si SetThreadExecutionState réinitialise le minuteur d'inactivité, il n'a pas arrêter l'économiseur d'écran!- Je utiliser Souris Jiggler pour réinitialiser l'état de veille. C'est une Stratégie de Groupe qui a tendance à démarrer mon économiseur d'écran (et de verrouillage de la machine) à un mauvais moment: quand je suis en train de lire un long document, l'étude d'un complexe bout de code, ou de parler/écouter/pas-constamment-typage lors d'une réunion.
Comme il peut être un peu ennuyeux à la souris sauter 1px en diagonale à chaque seconde, j'ai l'intention d'utiliser AutoHotKey à écrire un script qui fait la même chose, mais seulement après avoir configuré le clavier/souris délai d'inactivité, et peut-être utiliser la touche Maj (ou Scroll Lock) au lieu d'un déplacement de la souris.
De MSDN:
Il y a une mise en garde cependant:
Qui semble s'appliquer même si vous utilisez le SetThreadExecutionState avec ES_CONTINUOUS.
Donc, si ce n'était pas pour la mise en garde, votre choix serait:
La dernière option est agréable en ce qu'elle fonctionne même avec le mot de passe de protection de la politique.
Ne peux pas croire que personne n'a souligné la solution simple et évidente:
c:\C\Project>gcc test.c -o test test.c: In function 'main': test.c:6:7: error: unknown type name 'INPUT' INPUT input; ^ test.c:7:12: error: request for member 'type' in something not a structure or union input.type = INPUT_MOUSE; ^
Ce blog les détails de ce que vous devez faire en C++.
Le code extrait du site:
}
Dans Windows 7+, l'utilisation de la Gestion de l'Alimentation de l'API de
PowerSetRequest()
avecPowerRequestDisplayRequired
https://msdn.microsoft.com/en-us/library/windows/desktop/dd405534(v=vs. 85).aspx
Dans les versions précédentes de windows, d'intercepter le WM_SYSCOMMAND - SC_SCREENSAVE message comme détaillé dans Eddie Parker réponse.
Vous pouvez utiliser SystemParametersInfo
pour obtenir le
SCREENSAVETIMEOUT
puis immédiatement régler le délai d'attente de la même valeur. Le faire régulièrement sur une minuterie pour aussi longtemps que vous le souhaitez empêcher l'économiseur d'écran de passe.Ce qui a pour effet de réinitialiser le courant compte à rebours sans changer le réglage du système.
Vous avez sans doute aussi voulez l'appeler
SetThreadExecutionState
à affecter le pouvoir comme d'autres réponses mention.SPI_SETSCREENSAVEACTIVE
drapeau avec la même fonction? Essentiellement, il prétend que l'économiseur d'écran est déjà en cours d'exécution, empêcher un autre de départ. Au moins c'est la méthode de dix, douze ans en arrière.Juste réinitialiser le compteur de délai d'attente avec
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nul, SPIF_SENDWININICHANGE);