我有一个运行的服务,我希望在以下时间收到通知:
a)网络已连接。
b)当用户登录计算机时。
我该怎么做? (C#.NET 2.0)
答案 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#,你就完成了。