更新: 我们仍在使用XP工作,我的解决方案正在运行,但现在我知道Vista及其他人已经实现了隔离会议,我将实施一个WCF IPC ......
我有一个Windows服务需要通知用户某种类型的事件发生。我认为类似于电子邮件通知消息的内容是有意义的。使用WPF进行这样一个简单的UI也很有意义。这将让我学习一些基础知识。
我跑了一个帖子:
Thread thread = new Thread(new ThreadStart(RunUserNotificationOnIndependantThread));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
然后我设置对象并调用调用DoubleAnimation.BeginAnimation的方法
private void RunUserNotificationOnIndependantThread()
{
UserNotificationWithImage test = new UserNotificationWithImage();
test.Title = _title;
test.Url = _url;
test.Message = _message;
test.LoadUserNotification();
}
public void LoadUserNotification()
{
Rect workAreaRectangle = System.Windows.SystemParameters.WorkArea;
Left = workAreaRectangle.Right - Width - BorderThickness.Right;
Top = workAreaRectangle.Bottom - Height - BorderThickness.Bottom;
_fadeInAnimation.Completed += new EventHandler(_fadeInAnimation_Completed);
// Start the fade in animation
BeginAnimation(UserNotificationBase.OpacityProperty, _fadeInAnimation);
}
调试器到达BeginAnimation(...)并且没有窗口出现。这甚至是可能的还是我在尝试这个时做错了什么?
UserNotification代码基于Nicke Andersson的博客:WPF Desktop Alert blog
感谢您的帮助!!
答案 0 :(得分:4)
在XP上,与桌面交互的服务有两个需要克服的严重问题 - 当没有用户登录时该怎么办以及当多个用户登录时该怎么做(快速用户切换和终端服务是最常见的两个)登录多个用户的方法)。
在Vista上,出于安全原因,服务在他们自己的独立桌面上运行,因此您显示的任何UI都将放在用户无法访问的特殊桌面上。
您应该编写一个在用户桌面上运行的小Gui程序,并使用某种类型的IPC(Remoting,Soap,Rest,命名管道,文件,无论您喜欢什么)与服务进行通信。
答案 1 :(得分:1)
一般来说,我不会建议Windows服务直接与用户的桌面交互。举个简单的例子就是问题,因为服务可能会在任何用户登录之前启动。我的建议是创建一个小应用程序,通过用户会话启动并通过IPC(进程间通信)(如WCF)与Windows服务进行通信。
但是如果你确实想要让它运行,我的提示将是为服务打开“允许与桌面交互”,我似乎记得这个开关在Vista下根本不起作用,但是其他人应该确认一下。
HTH 亚历