默认情况下,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
));
}
}
}
}

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

标签: none

添加新评论