如何创建桌面图标/按钮以启动用户 Windows 设置了选项的屏幕保护程序

How to create desktop icon / button to start users Windows screensaver with options set

我需要一个可以放在 Windows 8 中的用户 desktop/process 栏上的按钮(任何子菜单都是不可接受的),它将启动用户屏幕保护程序(具有密码保护、自定义参数等) ).例如,这可以是批处理脚本的快捷方式。

我找到的解决方案的一些建议:

从 /system32 启动屏幕保护程序:不起作用

  1. 启动您选择的特定屏幕保护程序,而不是用户屏幕保护程序。
  2. 不带参数(即错误text/pic且无密码保护)。

WIN + L: 不起作用。

  1. 它不是用户桌面上的按钮,而且 SendKeys 似乎无法执行 WIN 键,因此无法使用批处理脚本。
  2. 它转到登录屏幕,而不是屏幕保护程序。

rundll32.exe user32.dll,LockWorkStation:不起作用。

  1. 它破坏了堆栈 - https://blogs.msdn.microsoft.com/oldnewthing/20040115-00/?p=41043/

C++ 程序:到目前为止,这就是我所拥有的可能有用的东西。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow)
{
  HWND DeskWin = GetDesktopWindow();
  Sleep(750);
  PostMessage(DeskWin, WM_SYSCOMMAND, SC_SCREENSAVE, NULL);
  return 0;
}

我以前从未使用过 Windows 系统消息,因此欢迎任何关于这是否总是有效的评论/想法。

或者如果有人有他们认为更好的方法。

-- 需要的原因:对 IT 感到恐惧的用户。如果你建议记住热键组合,或通过多个菜单(如开始 -> 用户名 -> 锁定),他们会嘲笑你,后者也是一个时间问题,因为他们可能不得不快速离开计算机(因此需要密码)保护)。

编辑** C++ 代码已修改以反映反馈。 Sendmessage 更改为 Postmessage,不希望像这样在 codesnip 中进行阻塞调用(但不明白为什么它应该在 window 已知时在 DefWindowProc 处抛出)。找到符号名称(http://wiki.winehq.org/List_Of_Windows_Messages,不能post更多链接,MSDN在WM_SYSCOMMAND下有第二个参数),WinMain是避免控制台弹出的Visual Studio东西,有些人对此感到担忧。

运行 用户的屏幕保护程序没有内置批处理命令(没有使用第 3 方解决方案来促进它)。您提供的代码是启动用户屏幕保护程序的正确解决方案。但是,不要像您展示的那样使用幻数文字。这些值有可用的定义,使用它们:

#include <windows.h>

int main(void)
{
    SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
    return 0;
}

将您的代码编译成 .exe 文件,将其安装在用户 PC 的某处,并在用户的桌面上创建指向它的快捷方式。