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

一:需求:用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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值