可以参考MSDN《.NET Windows编程系列课程(14):Windows 服务 (Level 200)》
http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/NETWindows.aspx
- public partial class Server1 : ServiceBase
- {
- Thread threadForm = null;
- public Server1()
- {
- InitializeComponent();
- }
- [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);
- protected override void OnStart(string[] args)
- {
- threadForm = new Thread(new ThreadStart(FormShow));
- threadForm.Start();
- }
- 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);
- dwGuiThreadId = IntPtr.Zero;
- SetThreadDesktop(hdeskSave);
- SetProcessWindowStation(hwinstaSave);
- CloseDesktop(hdeskUser);
- CloseWindowStation(hwinstaUser);
- }
- }
public partial class Server1 : ServiceBase { Thread threadForm = null; public Server1() { InitializeComponent(); } [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); protected override void OnStart(string[] args) { threadForm = new Thread(new ThreadStart(FormShow)); threadForm.Start(); } 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); dwGuiThreadId = IntPtr.Zero; SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); } }