Вверх ↑
Этот топик читают: Гость
Ответов: 182
Рейтинг: 14
#1: 2022-02-23 14:19:13 ЛС | профиль | цитата
Помогите пожалуйста.
Как отследить выход из системы или смену пользователя.
Нужно закрыть программу при смене пользователя.
карма: 0

0
Ответов: 783
Рейтинг: 168
#2: 2022-02-23 17:57:48 ЛС | профиль | цитата
Stalevar, Пример закрывает блокнот при выходе пользователя, а также при смене питания ноутбука сеть/батарея (для тестов).
Работает на Windows10 (ниже не проверял)

Add(MainForm,2953706,147,119)
{
link(onCreate,10252900:doEvent1,[])
}
Add(WinExec,6780336,287,196)
{
@Hint=#41:Закрывает блокнот при выходе пользователя|
FileName="powershell"
Param="-Command "If ( [ System.Environment ]:: SessionEnding ) {Get-Process -Name notepad | Stop-Process -Force}""
Mode=0
AddHint(110,-75,179,26,@Hint)
}
Add(WinExec,1234677,287,126)
{
@Hint=#17:Запускает блокнот|
FileName="powershell.exe"
Param="-Command "(start notepad)""
Mode=0
AddHint(71,-51,112,13,@Hint)
}
Add(Hub,10252900,210,133)
{
OutCount=3
link(onEvent1,1234677:doShellExec,[])
link(onEvent2,6780336:doShellExec,[(263,146)(263,209)])
link(onEvent3,4299586:doShellExec,[(256,153)(256,265)])
}
Add(WinExec,4299586,287,252)
{
@Hint=#55:Закрывает блокнот при изменении питания (для ноутбуков)|
FileName="powershell"
Param="-Command "If ( [ System.Environment ]:: PowerModeChanged ) {Get-Process -Name notepad | Stop-Process -Force}""
Mode=0
AddHint(93,-54,198,26,@Hint)
}

карма: 15

1
Голосовали:Stalevar
Ответов: 182
Рейтинг: 14
#3: 2022-02-26 21:17:08 ЛС | профиль | цитата
Gunta, Не много не то.
Нужно закрыть именно своё приложение.
в VB Net Примерно так:

    Private Sub UserSessionSwitch(ByVal sender As Object, ByVal e As SessionSwitchEventArgs)
Application.Exit()
End Sub
карма: 0

0
Ответов: 99
Рейтинг: 4
#4: 2022-03-02 18:55:34 ЛС | профиль | цитата
Stalevar, в MainForm есть скрытая точка onQueryEndSession, однако возможно это не совсем то, что тебе может быть нужно.
Если этой точки нет, скачивай альтернативную сборку. Или обновись с SVN.
карма: 0

0
Ответов: 182
Рейтинг: 14
#5: 2022-03-03 11:20:54 ЛС | профиль | цитата
TheRenat, Не подходит. При смене пользователя приложения не закрываются, нужно как то отследить смену пользователя.
Add(MainForm,2953706,196,91){
Point(onQueryEndSession)
link(onQueryEndSession,2953706:doClose,[(256,118)(256,160)(166,160)(166,118)])
}

Редактировалось 1 раз(а), последний 2022-03-03 11:21:10
карма: 0

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#6: 2022-03-03 17:12:53 ЛС | профиль | цитата
А если ловить в программе текущего пользователя системы
Схема


Add(MainForm,2798528,280,147)
{
Width=649
}
Add(EnvVars,12642055,343,189)
{
String="%UserName%"
link(onExpand,14451898:doText,[])
}
Add(Edit,14451898,406,189)
{
Left=15
Top=10
Width=140
Text=""
}
Add(Timer,9613164,280,189)
{
Interval=100
link(onTimer,12642055:doExpand,[])
}

карма: 22

0
Ответов: 783
Рейтинг: 168
#7: 2022-03-03 20:05:58 ЛС | профиль | цитата
nesco, Не совсем так. Данная схема так и останется работать в сессии того пользователя, от которого запущенна.
Как мне кажется, нужно подписаться на системное событие SessionSwitch (https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents?redirectedfrom=MSDN&view=dotnet-plat-ext-6.0#events).
Вот такая строка работает в Powershell
Register-ObjectEvent -InputObject ([microsoft.win32.systemevents]) -EventName "SessionSwitch" -Action {"SessionSwitch detected.";Get-Process -Name powershell | Stop-Process -Force}
Но она же не работает в схеме если не запущенна от администратора.
Add(MainForm,1220184,357,161)
{
Point(Handle)
link(onCreate,9836734:doExec,[])
}
Add(FormatStr,9241707,637,182)
{
DataCount=1
Mask="Register-ObjectEvent -InputObject ([microsoft.win32.systemevents]) -EventName "SessionSwitch" -Action {"Shutdown/Logoff detected.";Stop-Process -Id %1 -Force}\r\n"
Point(FString)
link(Str1,11443217:ProcessID,[])
}
Add(WinExec,9836734,406,175)
{
FileName="powershell"
Action="runas"
Point(ProcessID)
link(onExec,7769977:doDeferredEvent,[])
}
Add(FindWindow,15095067,518,175)
{
ClassName="ConsoleWindowClass"
SkipParam=1
link(onFind,3494617:doEvent1,[])
}
Add(DeferredEvent,7769977,462,175)
{
Delay=1000
link(onDeferredEvent,15095067:doFind,[])
}
Add(Hub,3494617,574,175)
{
OutCount=4
link(onEvent1,11443217:doWinInfo,[(599,181)(599,139)])
link(onEvent2,9241707:doString,[])
link(onEvent3,4107439:doSetText,[(627,195)(627,237)])
link(onEvent4,4107439:doPut,[(620,202)(620,244)])
}
Add(WinInfo,11443217,623,133)
{
Point(ProcessID)
link(Handle,1220184:Handle,[(629,103)(334,103)(334,205)(363,205)])
}
Add(ClipboardHook,4107439,637,231)
{
Point(Handle)
link(Text,9241707:FString,[])
}



Редактировалось 4 раз(а), последний 2022-03-04 12:40:38
карма: 15

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#8: 2022-03-03 21:25:15 ЛС | профиль | цитата
Stalevar писал(а):
Нужно закрыть программу при смене пользователя.


Если программа запущена от имени текущего пользователя, то, при выходе из сессии пользователя - все приложения данного пользователя завершаются автоматически.

Если речь о сервисе Windows, то действительно можно обработать событие смены сессии пользователя.

В других случаях (программа, запущенная от системного аккаунта или вход в систему ещё одного пользователя или другие ситуации) надо проверять на живую.

Редактировалось 1 раз(а), последний 2022-03-03 21:25:42
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 783
Рейтинг: 168
#9: 2022-03-04 12:40:13 ЛС | профиль | цитата
Stalevar писал(а):
Нужно закрыть программу при смене пользователя.

Наверное, самым простым будет создание задания для планировщика закрывающее конкретное приложение при входе другого пользователя в систему. (в примере - блокнот)

Add(MainForm,10111111,224,210)
{
link(onCreate,1234677:doShellExec,[])
}
Add(WinExec,1234677,301,217)
{
FileName="SchTasks"
Param="/Create /SC ONLOGON /TN "Test Task" /TR "TASKKILL /IM notepad.exe""
Mode=0
Action="runas"
AddHint(58,-83,197,26,Param)
}

карма: 15

0
Ответов: 1328
Рейтинг: 69
#10: 2022-03-04 16:52:49 ЛС | профиль | цитата
А что мешает сохранить имя текущего пользователя и проверять его по таймеру и если это не он закрыть форму?

Add(MainForm,5289906,448,231)
{
link(onCreate,2456753:doData,[])
}
Add(ComputerInfo,14474473,497,105)
{
}
Add(Timer,14051066,448,182)
{
Interval=10000
link(onTimer,4734356:doData,[])
}
Add(Case,12115249,574,182)
{
Point(doDataOnTrue)
link(onNextCase,5289906:doClose,[(627,188)(627,294)(436,294)(436,258)])
}
Add(DoData,2456753,497,245)
{
link(onEventData,12115249:doDataOnTrue,[(551,251)(551,195)])
link(Data,6800117:Var2,[])
}
Add(DoData,4734356,511,182)
{
link(onEventData,12115249:doCase,[])
link(Data,6800117:Var3,[(517,159)])
}
Add(GetDataEx,6800117,497,154)
{
link(Data,14474473:UserName,[])
}


Редактировалось 2 раз(а), последний 2022-03-04 16:53:24
карма: 2

1
Голосовали:Stalevar
Ответов: 249
Рейтинг: 4
#11: 2022-03-04 20:25:40 ЛС | профиль | цитата
Konst писал(а):
А что мешает сохранить имя текущего пользователя и проверять его по таймеру и если это не он закрыть форму?


этот вариант я тоже рассматривал, но он не работает, а вот если сохранить на диск имя пользователя в новой сессии и проверять из предыдущей тогда да.
карма: 1

0
Ответов: 182
Рейтинг: 14
#12: 2022-03-05 09:37:12 ЛС | профиль | цитата
Konst, Вроде работает, спасибо.
Запускаю проект-Сменить пользователя-Войти, и проект закрывается.

--- Добавлено в 2022-03-05 09:59:47

Stalevar писал(а):
Konst, Вроде работает, спасибо.
Запускаю проект-Сменить пользователя-Войти, и проект закрывается.

Поспешил, не работает

Редактировалось 1 раз(а), последний 2022-03-05 09:59:47
карма: 0

0
Ответов: 783
Рейтинг: 168
#13: 2022-03-09 12:18:39 ЛС | профиль | цитата
Konst писал(а):
А что мешает сохранить имя текущего пользователя и проверять его по таймеру и если это не он закрыть форму?

Stalevar писал(а):
Поспешил, не работает

Эта схема и не может работать. Легко проверить если вывести результат в Memo.

Add(MainForm,5289906,385,210)
{
link(onCreate,2456753:doData,[])
}
Add(ComputerInfo,14474473,434,84)
{
}
Add(Timer,14051066,385,161)
{
Interval=10000
link(onTimer,4734356:doData,[])
}
Add(Case,12115249,511,217)
{
Point(doDataOnTrue)
}
Add(DoData,2456753,434,224)
{
link(onEventData,12115249:doDataOnTrue,[])
link(Data,6800117:Var2,[])
}
Add(DoData,4734356,448,161)
{
link(onEventData,12756611:doAdd,[])
link(Data,6800117:Var3,[(454,138)])
}
Add(GetDataEx,6800117,434,133)
{
link(Data,14474473:UserName,[])
}
Add(Memo,12756611,511,161)
{
Left=550
Top=160
Align=5
ScrollBars=3
}

карма: 15

0
Ответов: 5227
Рейтинг: 587
#14: 2022-03-09 18:03:58 ЛС | профиль | цитата
Ну что же Вы как всегда топорно так велосипеды всякие придумываете.
Ну ведь есть нормальные цивилизованные способы https://docs.microsoft.com/en-us/windows/win32/shutdown/wm-queryendsession
т.е отловить приложением сообщение WM_QUERYENDSESSION и проверить в нём LPARAM
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#15: 2022-03-09 19:04:31 ЛС | профиль | цитата
Так прикол-то в том, что приложение нужно закрыть не при закрытии сессии, а при смене пользователя. Те, если зашел тот же пользователь, то приложение закрывать не надо, если другой -- то закрыть. Сообщение WM_QUERYENDSESSION не отлавливает смену пользователя, только закрытие сессии. Это сообщение, кстати, у нас отлавливается на форме и выдает запрос на точку QueryEndSession. Те, для решения задачи необходимо найти такое решение, которое определяет текущего пользователя вне зависимости от кого запущено приложение. Такое решение есть для VB.NET -- UserSessionSwitch, надо найти такое же решение для нас.

Редактировалось 5 раз(а), последний 2022-03-09 23:25:56
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)