Это довольно просто! Вы можете сделать несколько «предварительных» ходов с переопределением метода инициализации.
class YourControllerClass implements Initializable{
@Override
public void initialize(URL location, ResourceBundle resources) {
//Do stuff
}
}
Также вы можете запустить в методе инициализации новый поток, как это, чтобы предотвратить блокирование вашего приложения.
new Thread(() -> {
//Your stuff
}).run();
//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. Однако я не уверен, возможно ли сделать в C#. (У меня нет причины полагать, что это не, но я только когда-либо делал это в C++ и неуправляемом коде.)
Вот ссылка CodeProject
Я не знаю, как прислушаться, когда сеть соединяется.
Для обнаружения, когда сеть будет соединена добавьте обработчик для NetworkAvailabilityChanged
в System.Net.NetworkInformation.NetworkChange
класс.
Один простой способ узнать, когда пользователь входит в систему, состоит в том, чтобы сделать отдельный 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 (По сравнению с 85) .aspx
Сетевая осведомленность о Windows Vista
http://msdn.microsoft.com/en-us/library/ms697388 (По сравнению с 85) .aspx
SENS может сделать это. http://msdn.microsoft.com/en-us/magazine/cc301850.aspx
Проверьте и на ISensNetwork и на ISensLogon.
Адаптируйте это к C#, и Вы сделаны.
Чтобы получать уведомления, когда любой пользователь входит в систему, вызовите 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);