2009-03-26 30 views

答えて

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

SystemEvents.SessionSwitchが現在のユーザーに対してのみ発動することに気づかないかもしれませんが、これはユーザーの望むものではありません。 (SystemEvents.EnsureRegisteredSessionNotificationの.Netリファレンスソースを参照してください) – SLaks

+0

サービスからSystemEventsを使用するには、メッセージループが必要です。これを行う最も簡単な方法は、隠しフォームを作成することです。これの素晴らしい例は、http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspxの例2を参照してください。 – Rory

-1

WinLogin Notification packageと書くことができます。しかし、C#でできるかどうかはわかりません。 (私はそれがないと信じる理由はないが、私は唯一のこれまでC++とアンマネージコードでそれを行っている。)

ここ

は、私がときをリッスンする方法がわからないlink

CodeProjectのですネットワーク接続。

+0

リンクが機能していません。 –

0

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

+1

GINAは高速ユーザー切り替えに対応していないことに注意してください。 ターゲット環境によっては、 – SLaks

2

を見つけるにはネットワークが接続されているときに、NetworkAvailabilityChangedのハンドラを追加します。 n System.Net.NetworkInformation.NetworkChangeクラス。

ユーザがログインしたときに見つけ出す簡単な方法の1つは、別のexeファイルを作成して、それを共通の起動ファイルにすることです。 ユーザーがログインするたびに実行され、サービスと通信してユーザー名を与えることができます。 サービスをユーザーのデスクトップとやり取りする場合は、これが唯一の方法ですしかし、あなたがしなければ、これは良い考えではないかもしれません。マシンにするとき、ユーザーのログを通知する

複数のユーザーが、特に、リモートデスクトップまたは(Windows Serverの上で)ターミナルサービスを通じて、一度にログインすることが可能であることを忘れないでください

3

WTSRegisterSessionNotificationを呼び出し、NOTIFY_FOR_ALL_SESSIONSを渡し、メッセージループ内のWM_WTSSESSION_CHANGEメッセージを待ち受けます。メッセージで

は、何が起こったのかを見つけると、ユーザー名を見つけるために、WTSQuerySessionInformationlParamを渡すために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); 
関連する問題