如何在C#中使用OnSessionChange检测Windows登录事件

时间:2017-02-13 13:21:02

标签: c# windows

我无法在Windows中检测到此登录事件。

这是我的代码:

namespace ConsoleApplication2
{

    public class MyService: ServiceBase
    {
        public MyService()
        {
            CanPauseAndContinue = true;
            CanHandleSessionChangeEvent = true;
        }

        protected override void OnSessionChange(SessionChangeDescription changeDescription)
        {
            base.OnSessionChange(changeDescription);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyService tpl = new MyService();
            Thread t = new Thread(delegate()
            {
                while (true) { }
            });
            t.Start();
        }
    }
} 

如何测试运行此应用程序然后将远程桌面运行到我的笔记本电脑中?我可以看到在Windows EventViewer中生成的事件,但我的OnSessionChange从未被调用(我在里面添加了一个断点)。

我的代码是错误的还是我测试错误的方式?

1 个答案:

答案 0 :(得分:1)

通常,任何Windows桌面系统都不允许多个并发远程桌面会话。因此,为了使用RDP作为不同的用户登录,我假设您已经入侵了这个,或者正在使用Windows服务器(它排除了XP!)。

无论如何,登录系统的每个用户都将运行自己的应用程序,并且每组应用程序对该用户都是唯一的。所以App1可以由每个用户独立运行。

这意味着您的控制台应用程序无法检测到已登录的其他用户。

为此,您必须使用Windows服务。它在后台运行,可以检测并为多个用户工作,还可以检测登录和注销。见this SO link

这是从MyService继承ServiceBase的目的。如果您没有将该应用程序作为服务运行,那么您没有正确运行它!

您需要先install your application as a service然后像服务一样运行它。

您说您不认为您的应用程序可以作为服务运行。我不确定原因,但如果是这种情况,那么你必须考虑创建某种脚本来在启动/登录时运行你的应用程序。

这样,每次有人登录时,您的应用程序都会运行。无论如何,这对你来说可能更简单。

相关问题