私はサービスが動作していて、通知を受けたい場合:ネットワーク接続時およびユーザーログイン時のイベントの受信方法
a)ネットワークが接続されています。
b)ユーザがマシンにログインしたとき。
どうすればいいですか? (C#.NET 2.0)
私はサービスが動作していて、通知を受けたい場合:ネットワーク接続時およびユーザーログイン時のイベントの受信方法
a)ネットワークが接続されています。
b)ユーザがマシンにログインしたとき。
どうすればいいですか? (C#.NET 2.0)
//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
}
}
}
WinLogin Notification packageと書くことができます。しかし、C#でできるかどうかはわかりません。 (私はそれがないと信じる理由はないが、私は唯一のこれまでC++とアンマネージコードでそれを行っている。)
ここは、私がときをリッスンする方法がわからないlink
CodeProjectのですネットワーク接続。
リンクが機能していません。 –
センはこれを行うことができます。 http://msdn.microsoft.com/en-us/magazine/cc301850.aspx
ISensNetworkとISensLogonの両方を確認してください。
これをC#に適応させれば完了です。
b)は.NET 2.0では実行できません。 XP以前では、GINA置換を作成する必要があります.GINA置換は、指定された一連の関数をエクスポートするアンマネージDLLです。
Vistaでは、使用する必要がある別のCOMベースのモデルがあります。には.NET 2.0を使用できますが、できない場合は驚くことはありません。
GINAの交換品(またはVistaの同等品)にサービスを提供することができます。
)これら2つのリンクが助けることができる必要があります:
ネットワーク認識を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
GINAは高速ユーザー切り替えに対応していないことに注意してください。 ターゲット環境によっては、 – SLaks
を見つけるにはネットワークが接続されているときに、NetworkAvailabilityChanged
のハンドラを追加します。 n System.Net.NetworkInformation.NetworkChange
クラス。
ユーザがログインしたときに見つけ出す簡単な方法の1つは、別のexeファイルを作成して、それを共通の起動ファイルにすることです。 ユーザーがログインするたびに実行され、サービスと通信してユーザー名を与えることができます。 サービスをユーザーのデスクトップとやり取りする場合は、これが唯一の方法ですしかし、あなたがしなければ、これは良い考えではないかもしれません。マシンにするとき、ユーザーのログを通知する
複数のユーザーが、特に、リモートデスクトップまたは(Windows Serverの上で)ターミナルサービスを通じて、一度にログインすることが可能であることを忘れないでください
、 WTSRegisterSessionNotification
を呼び出し、NOTIFY_FOR_ALL_SESSIONS
を渡し、メッセージループ内のWM_WTSSESSION_CHANGE
メッセージを待ち受けます。メッセージで
は、何が起こったのかを見つけると、ユーザー名を見つけるために、WTSQuerySessionInformation
にlParam
を渡すためにMicrosoft.Win32.SessionSwitchReason
列挙型にwParam
をキャスト。
[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);
SystemEvents.SessionSwitchが現在のユーザーに対してのみ発動することに気づかないかもしれませんが、これはユーザーの望むものではありません。 (SystemEvents.EnsureRegisteredSessionNotificationの.Netリファレンスソースを参照してください) – SLaks
サービスからSystemEventsを使用するには、メッセージループが必要です。これを行う最も簡単な方法は、隠しフォームを作成することです。これの素晴らしい例は、http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspxの例2を参照してください。 – Rory