我编写了一个Windows服务,当某些情况发生时,它应该关闭显示器。我正在使用的代码是:
private const int MONITOR_OFF = 2;
SendMessage(GetDesktopWindow().ToInt32(),
WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
此相同的代码适用于Windows应用程序,但从Windows服务执行时,没有任何反应。也没有例外,Marshal.GetLastWin32Error()
也返回0。
关于我可能遗失的任何想法?
答案 0 :(得分:5)
由于服务没有对桌面的默认访问权限,因此您对GetDesktopWindow()的调用返回的内容不是您期望的;然后你盲目地将它转换为Int32并将其用作SendMessage()的窗口句柄目标。由于收件人可能不是有效窗口,因此它不会执行任何操作。
答案 1 :(得分:2)
您可以尝试在服务管理实用程序中编辑服务的属性,以允许桌面交互。
答案 2 :(得分:0)
服务在他们自己的虚拟桌面空间中运行(他们甚至可以拥有自己的用户配置文件空间。)它是Windows内置安全模型的一部分。您最好的选择是拥有在后台运行的服务以及在用户桌面上运行的用户模式客户端。根据用户的访问级别,用户可以终止服务/用户模式客户端。但您也可以查询进程以确保用户应用程序仍在运行。