当资源管理器不是shell时启动屏幕保护程序

时间:2010-09-09 15:23:19

标签: c# screensaver shellexecute

我正在运行自己的kiosk应用程序作为shell(替换HKLM / Software / Microsoft / Windows NT / winlogon / shell)。

应用程序需要能够关闭监视器,我正在使用Process.Start(“scrnsave.scr”)来执行此操作。它适用于我的开发机器,但不能在更换外壳时使用。

显然是因为UseShellExecute设置为true,但是当我将其设置为false时,我无法运行屏幕保护程序。使用explorer.exe作为命令并使用scrnsave.scr作为参数只会导致浏览器窗口打开。

是否有一个开关可以传递给资源管理器以使其运行屏幕保护程序,还是有其他方法可以实现相同的功能?

感谢。

1 个答案:

答案 0 :(得分:3)

您可以通过向系统发送Windows消息来启动屏幕保护程序。

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, 0)

您需要以下定义

static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
static readonly IntPtr SC_SCREENSAVE = new IntPtr(0xf140);
const uint WM_SYSCOMMAND = 0x112;

[DllImport("User32",SetLastError=true)]
extern static int SendMessage(
  IntPtr hWnd,
  uint Msg,
  IntPtr wParam,
  IntPtr lParam);

然后您可以按照以下方式使用

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, IntPtr.Zero);