zoukankan      html  css  js  c++  java
  • 设置Windows服务允许进行桌面交互,实现屏幕监控

    默认情况下,Windows服务基于安全考虑,是不允许任何服务程序和桌面进行交互的,也就是说,使用任何的Windows Form 的很多特性将会莫名奇妙的不起作用,如进行屏幕截图,或者使用System.Windows.Form.Timer对象也不行。由于Windows服务具有难以调试的特点,如果不注意这点,你反复检查自己的代码,都很难发现问题的所在的,我开始就是摸索了很久才发现,呵呵。

    Windows服务的优点有:1. 能够自动运行。2. 不要求用户交互。3. 在后台运行。

    一般情况下,Windows服务被用于耗费时间很多的进程中,例如备份数据库,数据同步等等。 

    本文介绍如何开启Windows服务桌面交互的设置,以便进行屏幕监控的功能开发,首先介绍一下屏幕监控的程序--绿苗帮电脑监控软件,它是随系统自动启动,在服务中定时进行屏幕截图的一个小软件,给家长提供监控小孩电脑使用情况使用的,系统管理界面如下所示 。



    Windows服务默认情况下,不支持进行屏幕截图的,需要在安装程序的时候,把系统的参数修改一下才可以,下面是两种方式实现该功能的开启 :

           private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e)
            {
                
    base.OnAfterInstall(e.SavedState);

                ManagementObject wmiService 
    = null;
                ManagementBaseObject InParam 
    = null;
                
    try
                {
                    wmiService 
    = new ManagementObject(string.Format("Win32_Service.Name='{0}'", Constants.ServiceName));
                    InParam 
    = wmiService.GetMethodParameters("Change");
                    InParam[
    "DesktopInteract"= true;
                    wmiService.InvokeMethod(
    "Change", InParam, null);
                }
                
    finally
                {
                    
    if (InParam != null)
                        InParam.Dispose();
                    
    if (wmiService != null)
                        wmiService.Dispose();
                }
            }

    另一种方式是通过注册表操作函数实现参数的修改:

            protected override void OnCommitted(System.Collections.IDictionary savedState)
            {
                
    base.OnCommitted(savedState);

                
    using (RegistryKey ckey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\" + Constants.ServiceName, true))
                {
                    
    if (ckey != null)
                    {
                        
    if (ckey.GetValue("Type"!= null)
                        {
                            ckey.SetValue(
    "Type", (((int)ckey.GetValue("Type")) | 256));
                        }
                    }
                }
            }

    最终达到的效果就是注册表的参数修改了,如下图所示:

     

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    那些你不知道的项目管理细节(四)—需求阶段的意识
    poj 3253 Fence Repair (STL优先队列)
    “大型票务系统”和“实物电商系统”在不能提供商品(服务)时给消费者带来的影响有巨大差异
    is和as在类型转换时的性能差异
    html5 5个重要特性
    xHTML与HTML的写法有什么不同?
    C++设计模式实现--訪问者(Visitor)模式
    开源,我的一些行动
    自写图片遮罩层放大功能jquery插件源代码,photobox.js 1.0版,不兼容IE6
    03004_SQL语句
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1795725.html
Copyright © 2011-2022 走看看