C#WINDOWS服务交互的实现的前言:这几天想做个文件监控服务,看了一下网上的关于WINDOWS服务的文章,数量都不少,都只讲了如何做一个最基本的服务,却没有讲述如何与用户进行交互。查看了MSDN,看一下关于服务的描述:

创新互联是一家专注于网站设计制作、成都网站建设与策划设计,大丰网站建设哪家好?创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:大丰等地区。大丰做网站价格咨询:18980820575
WINDOWS服务交互应用程序在不同于登录用户的交互区域的窗口区域中运行。窗口区域是包含剪贴板、一组全局原子和一组桌面对象的安全对象。由于 WINDOWS服务交互的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应。同样,错误信息应记录在 Windows 事件日志中,而不是在用户界面中引发。
.NET Framework 支持的 WINDOWS服务交互类不支持与交互区域(即登录用户)进行交互。同时,.NET Framework 不包含表示区域和桌面的类。如果 WINDOWS服务交互务必须与其他区域进行交互,则需要访问非托管的 Windows API。
也就是说我们要实现可交互的服务(比如我们想给服务在运行时做一些参数设置等),那我们一定要using System.Runtime.InteropServices
那么来看一下如果才能实现一个可交互的服务呢。步骤与实现基本的服务一样(各位可自行参考MSDN或网上google一下).
在实现OnStart时要注意,这里可不能弹出一个FORM什么的。这样做是没有任何反应的。我们可以在这个方法里运行一个线程。该线程需要访问窗口区域对象或桌面对象,当然 framework里是没有提供这些的,要访问非托管代码的。
来看一下代码,再运行试一下。
- using System;
 - using System.Collections;
 - using System.ComponentModel;
 - using System.Data;
 - using System.Diagnostics;
 - using System.ServiceProcess;
 - using System.Threading;
 - using System.Runtime.InteropServices;
 - namespace FileWatchService
 - {
 - public class Service1 : System.ServiceProcess.ServiceBase
 - {
 - ///
 - /// 必需的设计器变量。
 - ///
 - private System.ComponentModel.Container components = null;
 - Thread threadForm=null;
 - public Service1()
 - {
 - // 该调用是 Windows.Forms 组件设计器所必需的。
 - InitializeComponent();
 - // TODO: 在 InitComponent 调用后添加任何初始化
 - }
 - #region 组件设计器生成的代码
 - ///
 - /// 设计器支持所需的方法 - 不要使用代码编辑器
 - /// 修改此方法的内容。
 - ///
 - private void InitializeComponent()
 - {
 - // WINDOWS服务交互
 - // Service1
 - //
 - this.ServiceName = "JadeWatchService";
 - }
 - #endregion
 - [STAThread]
 - static void Main()
 - {
 - System.ServiceProcess.ServiceBase.Run(new Service1());
 - }
 - /// WINDOWS服务交互
 - /// 清理所有正在使用的资源。
 - ///
 - protected override void Dispose( bool disposing )
 - {
 - if( disposing )
 - {
 - if (components != null)
 - {
 - components.Dispose();
 - }
 - }
 - base.Dispose( disposing );
 - }
 - ///
 - /// 设置具体的操作,以便服务可以执行它的工作。
 - ///
 - protected override void OnStart(string[] args)
 - {
 - threadForm=new Thread(new ThreadStart(FormShow));
 - threadForm.Start();
 - }
 - /// WINDOWS服务交互
 - /// 停止此服务。
 - ///
 - protected override void OnStop()
 - {
 - if(threadForm!=null)
 - {
 - if(threadForm.IsAlive)
 - {
 - threadForm.Abort();
 - threadForm=null;
 - }
 - }
 - }
 - void FormShow()
 - {
 - GetDesktopWindow();
 - IntPtr hwinstaSave = GetProcessWindowStation();
 - IntPtr dwThreadId = GetCurrentThreadId();
 - IntPtr hdeskSave = GetThreadDesktop(dwThreadId);
 - IntPtr hwinstaUser = OpenWindowStation(
 - "WinSta0", false,33554432);
 - if (hwinstaUser == IntPtr.Zero)
 - {
 - RpcRevertToSelf();
 - return ;
 - }
 - SetProcessWindowStation(hwinstaUser);
 - IntPtr hdeskUser = OpenDesktop(
 - "Default", 0, false, 33554432);
 - RpcRevertToSelf();
 - if (hdeskUser == IntPtr.Zero)
 - {
 - SetProcessWindowStation(hwinstaSave);
 - CloseWindowStation(hwinstaUser);
 - return ;
 - }
 - SetThreadDesktop(hdeskUser);
 - IntPtr dwGuiThreadId = dwThreadId;
 - Form1 f=new Form1();
 - //此FORM1可以带notifyIcon,可以显示在托盘里,用户可点击托盘图标进行设置
 - System.Windows.Forms.Application.Run(f);
 - //WINDOWS服务交互
 - dwGuiThreadId = IntPtr.Zero;
 - SetThreadDesktop(hdeskSave);
 - SetProcessWindowStation(hwinstaSave);
 - CloseDesktop(hdeskUser);
 - CloseWindowStation(hwinstaUser);
 - }
 - [DllImport("user32.dll")]
 - static extern int GetDesktopWindow();
 - [DllImport("user32.dll")]
 - static extern IntPtr GetProcessWindowStation();
 - [DllImport("kernel32.dll")]
 - static extern IntPtr GetCurrentThreadId();
 - [DllImport("user32.dll")]
 - static extern IntPtr GetThreadDesktop(IntPtr dwThread);
 - [DllImport("user32.dll")]
 - static extern IntPtr OpenWindowStation(string a,bool b,int c);
 - [DllImport("user32.dll")]
 - static extern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,
 - bool fInherit, uint dwDesiredAccess);
 - [DllImport("user32.dll")]
 - static extern IntPtr CloseDesktop(IntPtr p);
 - [DllImport("rpcrt4.dll", SetLastError=true)]
 - static extern IntPtr RpcImpersonateClient(int i);
 - [DllImport("rpcrt4.dll", SetLastError=true)]
 - static extern IntPtr RpcRevertToSelf();
 - [DllImport("user32.dll")]
 - static extern IntPtr SetThreadDesktop(IntPtr a);
 - [DllImport("user32.dll")]
 - static extern IntPtr SetProcessWindowStation(IntPtr a);
 - [DllImport("user32.dll")]
 - static extern IntPtr CloseWindowStation(IntPtr a);
 - }
 - }
 
C#WINDOWS服务交互的实现的相关内容就向你介绍到这里,希望对你学习和了解C#WINDOWS服务交互的实现有所帮助。
                分享文章:C#WINDOWS服务交互的实现
                
                标题路径:http://www.csdahua.cn/qtweb/news45/199995.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网