您的位置:首页 > 产品设计 > UI/UE

Windows服务启动时,如何与UI进行交互

2013-03-01 14:44 211 查看
可以参考MSDN《.NET Windows编程系列课程(14):Windows 服务 (Level 200)》

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/NETWindows.aspx


[csharp] view plaincopyprint?

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: