一:需求:用c#语言,vs工具 ,在window服务中实现windows锁屏。
①:创建windows服务,详见 http://www.cnblogs.com/Cwj-XFH/p/5129812.html,写的比较清楚。
安装服务:
打开“我的电脑“,在地址栏输入 %systemroot%\Microsoft.NET\Framework
从列出来的文件夹中,我们可以看到v1.0.3705 v2.0.50727 v3.0 v3.5
而这些目录显示的最高版本号即本机Microsoft .NET Framework 版本号,也就是3.5的。
打开最高的版本号,赋值InstallUtil.exe程到你dubug\服务名.exe文件目录下.
用管理员权限启动cmd, cd到你服务名.exe文件目录下,用installutil 服务名.exe 安装服务。
打开服务
在服务管理器中,打开你的服务时出现
本地计算机上的XXX服务启动后停止,某些服务在未由其它服务或程序使用时将自动停止
错误时,右键我的电脑-》管理-》系统工具-》时间查看器->windows日志-》应用程序 可以看到你的服务启动失败的原因。(使用WindowsService服务出现的错误,以及最终的结局方案);
②使用lockworkstation方法进行锁屏。
定义:
[DllImport("User32.Dll", EntryPoint = "LockWorkStation")]
private static extern bool LockWorkStation();
使用
LockWorkStation();
但是发现实现不了锁屏,网上查了以下
原来该方法需要在交互式左面上进行被调用调用。
③:创建.exe可执行文件来实现锁屏功能。
首先需要用vs创建创建windows窗体应用程序,具体怎么创建,可另寻博客。
怎么创建.exe程序可查看http://blog.csdn.net/paullink520/article/details/14170021博客。
用lockworkstation()可实现锁屏的功能。
二:新需求,在原有的基础上再创建一个服务,来监听该exe程序是否运行,如果没有运行,让其运行。
我在服务中用Process.star()方法让exe程序启动,但是界面没有出现锁屏的效果,不过任务管理器中已经有exe程序的的进程。
在网上找了一番。原理win7为了服务安全的考虑,不让服务有这个功能,但是给服务
引用Cjwdev.WindowsApi.dll文件
拷贝如下代码就可以开启外部exe程序,实现该有的功能,也可以实现锁屏的功能。
try
{
string appStartPath = filePath; //exe程序的绝对地址
IntPtr userTokenHandle = IntPtr.Zero;
ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle);
ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION();
ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO();
startInfo.cb = (uint)Marshal.SizeOf(startInfo);
ApiDefinitions.CreateProcessAsUser(
userTokenHandle,
appStartPath,
"",
IntPtr.Zero,
IntPtr.Zero,
false,
0,
IntPtr.Zero,
null,
ref startInfo,
out procInfo);
if (userTokenHandle != IntPtr.Zero)
ApiDefinitions.CloseHandle(userTokenHandle);
int _currentAquariusProcessId = (int)procInfo.dwProcessId;
}
catch (Exception ex)
{
}