Windows服务启动时,如何与UI进行交互
可以参考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);
}
}
浙公网安备 33010602011771号