Как получить событие, когда сеть соединена и также когда пользователь входит в систему

Это довольно просто! Вы можете сделать несколько «предварительных» ходов с переопределением метода инициализации.

class YourControllerClass implements Initializable{
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //Do stuff
    }
}

Также вы можете запустить в методе инициализации новый поток, как это, чтобы предотвратить блокирование вашего приложения.

new Thread(() -> {
    //Your stuff
}).run();
9
задан Rory 26 March 2009 в 19:10
поделиться

6 ответов

//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
        }
    }
}
11
ответ дан 4 December 2019 в 14:31
поделиться

Вы могли записать пакет Уведомления WinLogin. Однако я не уверен, возможно ли сделать в C#. (У меня нет причины полагать, что это не, но я только когда-либо делал это в C++ и неуправляемом коде.)

Вот ссылка CodeProject

Я не знаю, как прислушаться, когда сеть соединяется.

-1
ответ дан 4 December 2019 в 14:31
поделиться

Для обнаружения, когда сеть будет соединена добавьте обработчик для NetworkAvailabilityChanged в System.Net.NetworkInformation.NetworkChange класс.

Один простой способ узнать, когда пользователь входит в систему, состоит в том, чтобы сделать отдельный exe и поместить его в общий запуск. Это было бы выполнено каждый раз, когда любой пользователь входит в систему, и мог затем общаться с Вашим сервисом и дать имя пользователя. Если Вы хотите, чтобы Ваш сервис взаимодействовал с рабочим столом пользователя, это (я верю), единственный способ сделать это. Если Вы не делаете однако, это не могло бы быть хорошей идеей.

Помните, что для многочисленных пользователей возможно быть зарегистрированным сразу, особенно через Службы удаленного рабочего стола или Службы удаленных рабочих столов (На Windows Server)

2
ответ дан 4 December 2019 в 14:31
поделиться

Вы не можете сделать 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 (По сравнению с 85) .aspx

Сетевая осведомленность о Windows Vista

http://msdn.microsoft.com/en-us/library/ms697388 (По сравнению с 85) .aspx

0
ответ дан 4 December 2019 в 14:31
поделиться

SENS может сделать это. http://msdn.microsoft.com/en-us/magazine/cc301850.aspx

Проверьте и на ISensNetwork и на ISensLogon.

Адаптируйте это к C#, и Вы сделаны.

-1
ответ дан 4 December 2019 в 14:31
поделиться

Чтобы получать уведомления, когда любой пользователь входит в систему, вызовите WTSRegisterSessionNotification , передав NOTIFY_FOR_ALL_SESSIONS , и прослушайте WM_WTSSESSION_CHANGE [11320] в цикле сообщений.

В сообщении приведите 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); 
3
ответ дан 4 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: