c#写服务、exe 可执行程序、windows锁屏的过程中遇到的问题

来源:互联网 发布:58同城合肥找美工 编辑:程序博客网 时间:2024/06/06 02:57

一:需求:用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)              {              }  



阅读全文
0 0
原创粉丝点击