欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【.NET实现可交互的WINDOWS服务的实例代码】,下面是详细的讲解!
.NET实现可交互的WINDOWS服务的实例代码
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
{
publicclass Service1 : System.ServiceProcess.ServiceBase
{
///
/// 必需的设计器变量。
///
private System.ComponentModel.Container components=null;
Thread threadForm=null;
public Service1()
{
// 该调用是 Windows.Forms 组件设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
}
#region 组件设计器生成的代码
///
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
///
privatevoid InitializeComponent()
{
//
// Service1
//
this.ServiceName="JadeWatchService";
}
#endregion
[STAThread]
staticvoid Main()
{
System.ServiceProcess.ServiceBase.Run(new Service1());
}
///
/// 清理所有正在使用的资源。
///
protectedoverridevoid Dispose(bool disposing)
{
if (disposing)
{
if (components !=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
///
/// 设置具体的操作,以便服务可以执行它的工作。
///
protectedoverridevoid OnStart(string[] args)
{
threadForm=new Thread(new ThreadStart(FormShow));
threadForm.Start();
}
///
/// 停止此服务。
///
protectedoverridevoid 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);
dwGuiThreadId=IntPtr.Zero;
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hwinstaUser);
}
[DllImport("user32.dll")]
staticexternint GetDesktopWindow();
[DllImport("user32.dll")]
staticextern IntPtr GetProcessWindowStation();
[DllImport("kernel32.dll")]
staticextern IntPtr GetCurrentThreadId();
[DllImport("user32.dll")]
staticextern IntPtr GetThreadDesktop(IntPtr dwThread);
[DllImport("user32.dll")]
staticextern IntPtr OpenWindowStation(string a, bool b, int c);
[DllImport("user32.dll")]
staticextern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,
bool fInherit, uint dwDesiredAccess);
[DllImport("user32.dll")]
staticextern IntPtr CloseDesktop(IntPtr p);
[DllImport("rpcrt4.dll", SetLastError=true)]
staticextern IntPtr RpcImpersonateClient(int i);
[DllImport("rpcrt4.dll", SetLastError=true)]
staticextern IntPtr RpcRevertToSelf();
[DllImport("user32.dll")]
staticextern IntPtr SetThreadDesktop(IntPtr a);
[DllImport("user32.dll")]
staticextern IntPtr SetProcessWindowStation(IntPtr a);
[DllImport("user32.dll")]
staticextern IntPtr CloseWindowStation(IntPtr a);
}
}
关于.NET实现可交互的WINDOWS服务的实例代码的用户互动如下:
相关问题:
答: >>详细
相关问题:
答: >>详细
相关问题:
答: >>详细
- 【asp】asp.net url重写浅谈-net-url重写
- 【DataSet】DataSet、DataTable、DataRow区别详解
- 【asp】asp.net 动态添加多个用户控件-net-动态添
- 【ASP】ASP.NET中内嵌页面代码的一个问题-NET-内
- 【As】Asp.net中的页面乱码的问题-sp--pn-ne-et
- 【增加记录】asp.net中获取新增加记录的ID Access
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【Asp】Asp.net 页面调用javascript变量的值-net-
- 【ASP】ASP.NET 5升级后如何删除旧版本的DNX-NET5
- 【404页面】ASP.NET设置404页面返回302HTTP状态码
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
