如何在连接网络时以及用户登录时接收事件

时间:2009-03-26 19:10:23

标签: c# .net events networking

我有一个运行的服务,我希望在以下时间收到通知:

a)网络已连接。

b)当用户登录计算机时。

我该怎么做? (C#.NET 2.0)

6 个答案:

答案 0 :(得分:11)

//using Microsoft.Win32;
//using System.Net.NetworkInformation;
public class SessionChanges
{
    public SessionChanges()
    {
        NetworkChange.NetworkAvailabilityChanged += 
            new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
        SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
    }

    void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        if (e.Reason == SessionSwitchReason.SessionLogon)
        { 
            //user logged in
        }
    }

    void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        if (e.IsAvailable)
        { 
            //a network is available
        }
    }
}

答案 1 :(得分:3)

要在任何用户登录计算机时收到通知,请致电WTSRegisterSessionNotification,传递NOTIFY_FOR_ALL_SESSIONS,然后在消息循环中侦听WM_WTSSESSION_CHANGE消息。

在邮件中,将wParam投射到Microsoft.Win32.SessionSwitchReason枚举,找出发生的情况,然后将lParam传递给WTSQuerySessionInformation以查找用户名。

[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); 

//Pass this value in dwFlags
public const int NOTIFY_FOR_ALL_SESSIONS          =  0x1; 

//Listen for this message
public const int WM_WTSSESSION_CHANGE = 0x02B1;

//Call this method before exiting your program
[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd); 

答案 2 :(得分:2)

要了解网络连接的时间,请在NetworkAvailabilityChanged课程中为System.Net.NetworkInformation.NetworkChange添加处理程序。

找出用户登录时间的一个简单方法是创建一个单独的exe并将其置于常见启动中。 只要有任何用户登录,它就会被执行,然后可以与您的服务通信并提供用户名。 如果您希望您的服务与用户的桌面交互,这是(我相信)唯一的方法。但是,如果不这样做,这可能不是一个好主意。

请记住,一次可以登录多个用户,尤其是通过远程桌面或终端服务(在Windows Server上)

答案 3 :(得分:0)

你不能用.NET 2.0做b)。对于XP及之前,您需要创建一个GINA替换,这是一个非托管DLL,它导出一组指定的函数。

在Vista中,有一个不同的基于COM的模型,您必须使用可能能够使用.NET 2.0,但如果您不能,我不会感到惊讶

我要做的是让你的GINA替换(或Vista上的等效物)向你的服务发送某种信号。

对于a)这两个链接应该能够提供帮助:

Windows XP中的网络意识

http://msdn.microsoft.com/en-us/library/ms700657(VS.85).aspx

Windows Vista上的网络意识

http://msdn.microsoft.com/en-us/library/ms697388(VS.85).aspx

答案 4 :(得分:-1)

你可以写一个WinLogin Notification package。但是,我不确定是否可以用C#做​​。 (我没有理由相信它不是,但我只用C ++和非托管代码完成它。)

这是一个CodeProject link

我不知道如何在网络连接时收听。

答案 5 :(得分:-1)

SENS可以做到这一点。 http://msdn.microsoft.com/en-us/magazine/cc301850.aspx

检查ISensNetwork和ISensLogon。

适应C#,你就完成了。