2009-09-15 13 views

Répondre

2
using System; 
using System.Runtime.InteropServices; 

public static class LockDesktop 
{ 
    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] 
    private static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    private const int SC_SCREENSAVE = 0xF140; 
    private const int WM_SYSCOMMAND = 0x0112; 

    public static void SetScreenSaverRunning() 
    { 
     SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); 
    } 

    public static void Main() 
    { 
     LockDesktop.SetScreenSaverRunning(); 
    } 
} 

Cela fonctionne - seul inconvénient est que u cant interagir avec pc pour quelque chose comme 7 sec, mais je pense que ses 7 années pour donner ppl temps avant de faire écran « permanent ».

+0

La solution Grant Wagners démarre l'économiseur d'écran, puis verrouille l'écran, mais le verrou provoque la sortie de l'économiseur d'écran. Cette solution démarre simplement l'économiseur d'écran sans le verrouiller explicitement, il faut donc quelques secondes avant qu'il ne soit verrouillé par les fenêtres. Inverser l'ordre de la solution Grant Wagners (en appelant LockWorkStation avant SendMessage) résout les deux problèmes, l'écran est immédiatement verrouillé et l'économiseur d'écran est démarré après. – Istador

9

Est-ce que ce qui suit répond à vos besoins?

start logon.scr /s 

Tant que le .scr est sur le chemin de la commande ci-dessus devrait fonctionner.

EDIT: Je ne sais pas si Windows 7 est livré avec logon.scr, assurez-vous que vous testez avec un .scr qui est réellement installée dans Windows 7.

Notez que j'ai eu l'idée de simplement invoquer la .scr avec /s de Screensaver Sample Command Line Options:

Lorsque Windows fonctionne votre écran de veille, il lance avec l'une des trois options de ligne de commande :

  • /s - Démarrer l'économiseur d'écran en mode plein écran.
  • /c - Affiche la boîte de dialogue des paramètres de configuration.
  • /p #### - Affiche un aperçu de l'économiseur d'écran en utilisant la poignée de fenêtre spécifiée.

EDIT 2:

Je l'ai fait quelques recherches supplémentaires et a constaté que vous pouvez créer lock.cmd:

@start /wait logon.scr /s & rundll32 user32.dll,LockWorkStation 

Ou lock.vbs:

Set objShell = CreateObject("Wscript.Shell") 
' The "True" argument will make the script wait for the screensaver to exit 
returnVal = objShell.Run("logon.scr", 1, True) 
' Then call the lock functionality 
objShell.Run "rundll32.exe user32.dll,LockWorkStation" 

Aucune de ces réponses est parfait, les deux révèlent un scintillement du bureau après r l'économiseur d'écran est désactivé et juste avant le verrouillage du poste de travail.

Il peut ne pas être possible de reproduire le comportement du système lors du démarrage de l'économiseur d'écran et de la protection par mot de passe lors de la reprise. Même the answer to Launch System Screensaver from C# Windows Form commence seulement l'économiseur d'écran, il ne protège pas le mot de passe à la reprise.

+0

Je ne me souviens pas comment cela a fonctionné dans les vieilles fenêtres, mais dans 7 il montre juste comment cet économiseur d'écran aurait l'air mais il ne l'allume pas réellement (Ce que je veux dire, c'est quand vous interagissez avec le système, l'économiseur disparaît, quand l'écran de connexion devrait s'afficher) –

+0

@Grant, Pourriez-vous copier "Edit 3" dans une réponse séparée? Je voudrais le remettre en question, mais le but de l'upvoting est de faire en sorte que la bonne réponse soit au top, et les gens n'ont pas besoin de passer au crible les tentatives précédentes. :-) –

+0

@system: La solution C# est maintenant une réponse séparée. J'ai laissé cette réponse telle quelle dans le cas où les solutions 'cmd' ou' vbs' sont "assez bonnes" pour les autres qui posent la même question. –

5

Mettre sur pied the cmd and vbs script ideas avec le code de the answer to Launch System Screensaver from C# Windows Form je suis venu avec les éléments suivants:

using System; 
using System.Runtime.InteropServices; 

public static class LockDesktop 
{ 
    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] 
    private static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    [DllImport("user32.dll", EntryPoint = "LockWorkStation")] 
    private static extern IntPtr LockWorkStation(); 

    private const int SC_SCREENSAVE = 0xF140; 
    private const int WM_SYSCOMMAND = 0x0112; 

    public static void SetScreenSaverRunning() 
    { 
     SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); 
     LockWorkStation(); 
    } 

    public static void Main() 
    { 
     LockDesktop.SetScreenSaverRunning(); 
    } 
} 

Pour construire, install the .NET Framework, copiez et collez le code ci-dessus dans lock.cs, puis exécutez:

%SystemRoot%\Microsoft.NET\Framework\v3.5\csc.exe lock.cs 

Mettez le lock.exe créé dans votre chemin, après cela, en tapant lock devrait engager l'économiseur d'écran configuré et verrouiller votre station de travail.

+1

Trop sucré! Cela fonctionne parfaitement pour moi sur XP, 2003 et 2008, et je ne peux pas imaginer quoi que ce soit qui ferait échouer sur Vista ou 7 (bien que je ne l'ai pas essayé là-bas). MERCI! –

+0

@oO Remarque: Windows 7 est fourni avec .NET 3.5 SP1. Vous pouvez donc ignorer l'étape d'installation si vous essayez cette méthode. –

+0

@system PAUSE bien, il le fait - après l'activation il y a un blip (économiseur d'écran je suppose) et ensuite vous êtes rediriger vers l'écran de connexion. il ya une solution - j'ai posté est comme une réponse –

0

Cela semble étrange, que partout où j'ai regardé il n'y a pas de réponse qui reflète cela dans le O/S lui-même. Ce que font tous ces hacks, c'est d'exécuter l'économiseur d'écran et puis, à l'arrêt (interrompu), le programme exécute le verrou workstation/desktop, après le fait. L'effort sans faille pour invoquer un économiseur d'écran avec une protection par mot de passe que lorsque je suis arrêté/interrompre un mot de passe est nécessaire pour revenir dans le poste de travail. Ne semble pas être un si grand ordre, n'est-ce pas? Je continuerai à rechercher tout type de solution de langage de programmation que je puisse trouver, mais qui doit évidemment être invoqué par d'autres applications au niveau de l'application (y compris les technologies de script), plutôt que d'être enterré au niveau O/S .

3

J'ai Windows 7. Je mis la ligne:

@Start/wait% windir% \ ExtraPath \ ScreenSaverName.scr/s & rundll32 user32.dll, LockWorkStation

dans un lot (.bat), placez-le dans un répertoire approprié et créez un raccourci pointant vers celui-ci, avec la touche de raccourci désirée. Dans cette ligne, \ ExtraPath est le chemin supplémentaire sous votre répertoire de gains (en général, c'est \ system32) où se trouvent les économiseurs d'écran, et ScreenSaverName.scr est le nom de l'économiseur d'écran désiré lui-même.

Cela fonctionne parfaitement.

Maintenant, je peux appuyer sur les touches de raccourci pour exécuter l'économiseur d'écran et verrouiller le PC.

Merci beaucoup beaucoup.