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

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

a)网络已连接。

b)当用户登录机器时。

我怎样才能做到这一点? (C#.NET 2.0)

要在任何用户登录计算机时收到通知,请调用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); 

要找出网络何时连接,请在System.Net.NetworkInformation.NetworkChange类中为NetworkAvailabilityChanged添加处理程序。

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

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

你不能用b)使用.NET 2.0。 对于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

您可以编写WinLogin通知包 。 但是,我不确定是否可以在C#中进行。 (我没有理由相信它不是,但我只用C ++和非托管代码完成它。)

这是CodeProject 链接

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

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

检查ISensNetwork和ISensLogon。

适应C#,你就完成了。