如何通过代码(在cmd中)打开Windows 7的屏幕保护程序?

10
如何通过代码在Windows 7中打开屏幕保护程序(使用cmd)?
5个回答

10

以下内容是否符合您的要求?

start logon.scr /s
只要将.scr添加到PATH路径中,上述命令就应该可以工作。
编辑:我不知道Windows 7是否带有logon.scr,请确保您使用的是实际安装在Windows 7中的.scr
请注意,我从屏幕保护程序示例命令行选项中获取了仅使用/s调用.scr的想法:
引用:

当Windows运行您的屏幕保护程序时, 它会使用以下三个命令之一来启动它:

  • /s - 以全屏模式启动屏幕保护程序。
  • /c - 显示配置设置对话框。
  • /p #### - 使用指定的窗口句柄显示屏幕保护程序的预览。
编辑2:
我进行了进一步搜索,并发现您可以创建lock.cmd
@start /wait logon.scr /s & rundll32 user32.dll,LockWorkStation

或者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"

这两个答案都不完美,都会在屏幕保护程序被禁用并且工作站锁定之前显示一闪而过的桌面。

可能无法重现启动屏幕保护程序并在恢复后保护密码的系统行为。即使从C# Windows表单启动系统屏幕保护程序的答案只会启动屏幕保护程序,它也不会在恢复时保护密码。


我不记得在旧版的Windows中它是如何工作的,但在Windows 7中,它只是展示屏保的外观,但实际上并没有启动它(我的意思是当您与系统交互时,屏幕保护程序会消失,而应该显示登录屏幕)。 - o_O
@Grant, 你介意把“编辑3”复制到一个单独的答案中吗?我想点赞它,但点赞的目的是让正确的答案在最上面,这样大家就不必浏览早期的尝试了。 :-) - system PAUSE
@system:C#解决方案现在是一个独立的答案。我保留了这个答案,以防cmdvbs的解决方案对其他问同样问题的人来说“足够好”。 - Grant Wagner

7

结合cmd和vbs脚本的想法以及从C# Windows表单启动系统屏幕保护程序的答案中的代码,我得到了以下结果:

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

要构建它,安装 .NET Framework,将上述代码复制并粘贴到 lock.cs 中,然后运行:

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

将创建好的 lock.exe 文件放在环境变量中,之后输入命令 lock 即可启动配置好的屏幕保护程序并锁定工作站。

1
太棒了!在XP、2003和2008上运行得非常完美,我无法想象任何可能导致它在Vista或7上失败的原因(尽管我还没有在那里尝试过)。谢谢! - system PAUSE
请注意:Windows 7已经预装了.NET 3.5 SP1,因此如果您使用该系统,可以跳过安装步骤。 - system PAUSE
@system PAUSE 好的,激活后会有一个短暂的屏幕保护程序,然后您将被重定向到登录屏幕。这个问题有一个解决方法 - 我已经在答案中发布了。 - o_O

3
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();
    }
}

这个方法可行 - 唯一的缺点是您不能与电脑进行交互,大约需要7秒钟,但我想这是为了给人们留出时间,以避免屏幕保护程序“永久”生效。

Grant Wagner的解决方案先启动屏幕保护程序,然后锁定屏幕,但是锁定会导致屏幕保护程序退出。这个解决方案只是启动屏幕保护程序,没有明确锁定它,因此需要等待一些时间,直到Windows自动锁定。将Grant Wagner的解决方案的顺序颠倒(在发送消息之前调用LockWorkStation)可以解决这两个问题,屏幕立即被锁定,之后才开始启动屏幕保护程序。 - Istador

3

I have Windows 7. I placed the line:

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

在批处理(.bat)文件中,将其放置在适当的目录下,并创建一个指向此文件的快捷方式,包含所需的快捷键。
在此行中,\ExtraPath是您win目录下的附加路径(通常为\system32),其中屏幕保护程序位于该路径下,而ScreenSaverName.scr则是所需屏幕保护程序的名称。
它完美地运作。
现在我可以按快捷键运行屏幕保护并锁定电脑。

2

那意味着需要下载额外的软件 - 我不想要那个。 - o_O
@oO.: Powershell已经预装在Windows 7上。 - surfasb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接