Windows服务通知用户WPF Outlook样式控件不可见

时间:2009-02-11 08:29:16

标签: wpf wcf windows-services remoting

更新: 我们仍在使用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

感谢您的帮助!!

2 个答案:

答案 0 :(得分:4)

在XP上,与桌面交互的服务有两个需要克服的严重问题 - 当没有用户登录时该怎么办以及当多个用户登录时该怎么做(快速用户切换和终端服务是最常见的两个)登录多个用户的方法)。

在Vista上,出于安全原因,服务在他们自己的独立桌面上运行,因此您显示的任何UI都将放在用户无法访问的特殊桌面上。

您应该编写一个在用户桌面上运行的小Gui程序,并使用某种类型的IPC(Remoting,Soap,Rest,命名管道,文件,无论您喜欢什么)与服务进行通信。

答案 1 :(得分:1)

一般来说,我不会建议Windows服务直接与用户的桌面交互。举个简单的例子就是问题,因为服务可能会在任何用户登录之前启动。我的建议是创建一个小应用程序,通过用户会话启动并通过IPC(进程间通信)(如WCF)与Windows服务进行通信。

但是如果你确实想要让它运行,我的提示将是为服务打开“允许与桌面交互”,我似乎记得这个开关在Vista下根本不起作用,但是其他人应该确认一下。

HTH 亚历