Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/27: Рейтинг темы: голосов - 27, средняя оценка - 4.78
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252

Как можно отследить завершение сеанса пользователя чтобы успеть перед этим сохранить данные

28.01.2011, 08:21. Показов 5595. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я делаю программу которая бы отслеживала время когда пользователь заходит в систему и выходит из системы и сохраняет эти данные в файл я вначале сделал вот так :
При загрузке формы сохраняем значение datatime.now и затем при выходе из программы нажатие кнопки вновь сохраняем текущее время ( на момент выхода) в файле. Но возникла проблема , я сделал чтобы программа запускалась при входе пользователя в систему( автораном) , но тогда почему то время перестало сохраняться в файл, да и при выходе пользователя из системы тоже надо как то отслеживать это и сохранять данные в файл, а через событие закрытия формы не работает т к программа завершается аварийно можно сказать( раз не пользователь ее закрывает а ОС ) Так вот вопрос , как правильно сделать такую программу???
сохраняю данные так но тут то я думаю все правильно
C#
1
2
3
4
5
6
7
8
9
public void finishTimeWorking()
        {
            myDate.endTimeOfWorking = DateTime.Now;
            StreamWriter myStream = new StreamWriter("TEST.rtf",true,Encoding.UTF8);            
            myStream.Write("Имя пользователя : {0} \nВремя начала работы: {1} \nВремя окончания работы: {2}\n",myDate.nameOfUser,myDate.startTimeOfWorking,myDate.endTimeOfWorking);
            myStream.Write("***********************************************\n");
            myStream.Flush();
            myStream.Close();
        }
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2011, 08:21
Ответы с готовыми решениями:

Удаленное завершение сеанса пользователя
Здравствуйте. 1) Я накидал вот такой батник, для удаленного завершения сеанса пользователя. @echo off chcp 1251>null msg admib...

При закрытии RDP завершение сеанса пользователя
Здравствуйте, мне нужно, чтобы при входе в систему открывался сразу RDP-файл, а при закрытии был произведен выход из пользователя (на...

Завершение повисшего сеанса терминала, по требованию пользователя
В общем проблема такая, стоит win server 2003 к нему подцепляются по терминалу пользователи для работы с 1с(в терминале пользователи кроме...

15
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 11:39
Microsoft.Win32.SystemEvents.SessionEnded
1
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 14:26  [ТС]
Оббана спасибо , я уж думал что это ваще нереально сделать или там с помощью апи мутить надо было бы спасибо

Добавлено через 1 час 20 минут
Блин эксепшн вываливается Ошибка при создании дескриптора окна. вот тут
C#
1
Application.Run(new Form1());
пытаюсь сделать так
C#
1
2
3
4
5
6
7
private static int WM_QUERYENDINGSESSION = 0x11;
        private static bool systemshutdown = false;
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == WM_QUERYENDINGSESSION)
                systemshutdown = true;
        }

C#
1
2
3
4
5
6
7
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (systemshutdown)
            {                
                   myDate.finishTimeWorking();               
            }
        }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 15:05
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.IO;
using System.Windows.Forms;
 
namespace SessionEndedTest
{
    public partial class Form1 : Form
    {
        const int WM_QUERYENDSESSION = 0x11;
        bool systemShutdown = false;
 
        public Form1() {
            InitializeComponent();
        }
 
        protected override void WndProc( ref Message m ) {
            if (m.Msg == WM_QUERYENDSESSION) {
                systemShutdown = true;
            }
            base.WndProc(ref m);
        }
 
        private void Form1_FormClosing( object sender, FormClosingEventArgs e ) {
            if (systemShutdown) {
                systemShutdown = false;
                using (StreamWriter sw = new StreamWriter("D:\\temp.txt")) {
                    sw.WriteLine("Ended");
                }
            }
        }
    }
}
UPD: приведенный там пример немного неверен, т.к. во время прихода сообщения WM_QUERYENDSESSION не гарантируется что система будет выключена или юзер выйдет из неё, т.к. это событие можно отменить. В данном случае можно поступить иначе: обрабатывать сообщение WM_ENDSESSION, при котором уже гарантируется что система будет выключена, но тогда не факт что программа успеет записать все данные (если их много). Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.IO;
using System.Windows.Forms;
 
namespace SessionEndedTest
{
    public partial class Form1 : Form
    {
        const int WM_QUERYENDSESSION = 0x11;
        const int WM_ENDSESSION = 0x16;
        bool systemShutdown = false;
 
        public Form1() {
            InitializeComponent();
        }
 
        protected override void WndProc( ref Message m ) {
            switch (m.Msg) {
                case WM_QUERYENDSESSION:
                    if (MessageBox.Show("Close app?", null, MessageBoxButtons.YesNo) == DialogResult.Yes) {
                        base.WndProc(ref m);
                    }
                    return;
                case WM_ENDSESSION:
                    systemShutdown = true;
                    break;
            }
            
            base.WndProc(ref m);
        }
 
        private void Form1_FormClosed( object sender, FormClosedEventArgs e ) {
            if (systemShutdown) {
                systemShutdown = false;
                using (StreamWriter sw = new StreamWriter("D:\\temp.txt")) {
                    sw.WriteLine("Ended");
                    sw.Flush();
                }
            }
        }
    }
}
1
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 16:07  [ТС]
аа да верно причем начало сохранять почему то именно после того как я закоментил строки
C#
1
2
            //myStream.Flush();
            //myStream.Close();
только ничего туда не пишет , оставляет пустой файл , щас попробую еще разобраться с обнавленным примером

Добавлено через 24 минуты
Нет он тогда выдает сообщение Отправлять или не отправлять ошибку
только я так сделал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
        }
        const int WM_QUERYENDSESSION = 0x11;
        const int WM_ENDSESSION = 0x16;
        bool systemShutdown = false;
        Model myModel = new Model();
        protected override void WndProc(ref Message m)        
        {
            switch (m.Msg)
            {
                case WM_QUERYENDSESSION:
                    if (MessageBox.Show("Close App?", null, MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        base.WndProc(ref m);
                    }
                    return;
                case WM_ENDSESSION:
                    systemShutdown = true;
                    break;
            }
 
            
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
           if(systemShutdown)
           {
               systemShutdown = false;
               myModel.finishTimeWorking();
               if (DialogResult.Yes == MessageBox.Show("My application",
                   "Do you want to save you work before logging off",
                   MessageBoxButtons.YesNo)) ;
               {
                   e.Cancel = true;
 
               }
               {
                   e.Cancel = false;
               }
               //using (StreamWriter sw = new StreamWriter("testOne.txt")) 
               //{
               //    sw.WriteLine("form closing!!!");
               //    //sw.Flush();
               //    //sw.Close();
               //}
           }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            myModel.startTimeWorking();
        }
    }
Добавлено через 10 минут
Пишет: ошибка при создании дескриптора окна
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 16:09
А нафига ты
это
C#
1
2
3
4
5
6
7
8
9
10
if (DialogResult.Yes == MessageBox.Show("My application",
                   "Do you want to save you work before logging off",
                   MessageBoxButtons.YesNo)) ;
               {
                   e.Cancel = true;
 
               }
               {
                   e.Cancel = false;
               }
запихнул в FormClosing (к тому же у меня Closed)? При systemShutdown уже 99% что система завершится и все твои msgbox'ы пройдут мимо.

Если тебе надо спрашивать о том, завершать приложение или нет, то для этого я и оставил код:
C#
1
2
3
4
5
if (MessageBox.Show("Close App?", null, MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        base.WndProc(ref m);
                    }
                    return;
если же тебе это не надо то так, и вопросов со стороны приложения не будет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.IO;
using System.Windows.Forms;
 
namespace SessionEndedTest
{
    public partial class Form1 : Form
    {
        const int WM_QUERYENDSESSION = 0x11;
        const int WM_ENDSESSION = 0x16;
        bool systemShutdown = false;
 
        public Form1() {
            InitializeComponent();
        }
 
        protected override void WndProc( ref Message m ) {
            switch (m.Msg) {
                //case WM_QUERYENDSESSION:
                //    if (MessageBox.Show("Close app?", null, MessageBoxButtons.YesNo) == DialogResult.Yes) {
                //        base.WndProc(ref m);
                //    }
                //    return;
                case WM_ENDSESSION:
                    systemShutdown = true;
                    break;
            }
            
            base.WndProc(ref m);
        }
 
        private void Form1_FormClosed( object sender, FormClosedEventArgs e ) {
            if (systemShutdown) {
                systemShutdown = false; // можно убрать, толку 0
                using (StreamWriter sw = new StreamWriter("D:\\temp.txt")) {
                    sw.WriteLine("Ended");
                    sw.Flush();
                }
            }
        }
    }
}
0
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 16:32  [ТС]
О спасибо все заработало Скажите а для того чтобы сделать чтобы она автоматически запускалась при загрузке ОС нужно тоже какое то событие отлавливать? ( просто так то в автозагрузку ее не трудно поставить а вот как сделать чтобы она еще и работала при этом правильно это уже проблема
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 16:49
Цитата Сообщение от timur2008 Посмотреть сообщение
Скажите а для того чтобы сделать чтобы она автоматически запускалась при загрузке ОС нужно тоже какое то событие отлавливать?
Нет, надо просто добавить программу в автозагрузку.
Цитата Сообщение от timur2008 Посмотреть сообщение
как сделать чтобы она еще и работала при этом правильно это уже проблема
Не знаю - подумай Твоя ж программа )
1
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 16:58  [ТС]
А есть вообще какой нибудь нормальный справочник по API где указываются константы виндовс наподобие
C#
1
2
WM_QUERYENDSESSION = 0x11;
                WM_ENDSESSION = 0x16;
?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 17:05
MSDN + MS SDK, принцип таков:
1й шаг: Ищешь константу в MSDN, на каждой странице есть внизу раздел Requirements и таблица в которой есть поле Header, где указывается в каком заголовочном (*.h) файле она определена.
2й шаг: Открываешь у себя X:\Program Files\Microsoft SDKs\Windows\vX.X\Include\ и ищешь нужный заголовочный файл (header), а в нём константу.

+ Есть программы в которых они забиты, но я привык доверять только SDK.
0
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 18:40  [ТС]
Аа понятно спасибо , щас посмотрим

Добавлено через 1 час 29 минут
Блин я чето не могу понять как искать нужные константы там этих хэндлеров в вин сдк сотни а как найти нужный хэндлер я с нужной константой я чето не догоняю
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2011, 02:18
хэндлер
header

Ещё раз прочитай мой предыдущий пост.
1.
2.
3.
0
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
29.01.2011, 07:38  [ТС]
Блин я нашел этот WM_STARTSESSION но там я так понял что вместо него теперь используется DBT_USERDEFINED
и я пытаюсь сделать так
C#
1
const int DBT_USERDEFINED = 0xFFFF;
C#
1
2
3
case DBT_USERDEFINED:
                    systenStart = true;
                    break;

C#
1
2
3
4
5
6
7
8
9
10
11
private void Form1_Load(object sender, EventArgs e)
        {
            RegistryKey reg = Registry.CurrentUser.CreateSubKey(
                 "Software\\microsoft\\windows\\currentversion\\run");
            reg.SetValue("Working Place", Application.ExecutablePath);
            reg.Close();
            if (systenStart)
            {
                model.startTimeWorking();
            }
        }
но ничего не работает,( в смысле не сохраняет) извините ,но может быть я что то не так понял?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2011, 14:27
Цитата Сообщение от timur2008 Посмотреть сообщение
Блин я нашел этот WM_STARTSESSION
Такой константы не существует.
Цитата Сообщение от timur2008 Посмотреть сообщение
DBT_USERDEFINED
Это из другой оперы.

Я не знаю где и что ты там ищешь - я всё объяснил, 2 раза.
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
29.01.2011, 16:29
Цитата Сообщение от timur2008 Посмотреть сообщение
А есть вообще какой нибудь нормальный справочник по API где указываются константы виндовс наподобие
http://pinvoke.net/ ?
1
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
30.01.2011, 08:03  [ТС]
SSTREGG эхх ок еще раз глянем,Unril спасибо, а ты не мог бы объяснить как этой штукой пользоваться? всетаки использование событий виндовс при программировании это прикольная штука
к примеру мне нужно найти событие ( или похоже код события ?!?) которое возникает при входе пользователя в систему? Извиняюсь что туплю но я просто раньше с такими вещами никогда не сталкивался

Добавлено через 14 часов 18 минут
Нет не получаеся , когда я вручную запускаю программу ( а не с помощью авторана) то все сохраняется нормально, но если пробывать ее запускать через автозагрузку то ничего не сохраняет . Я пытался использовать события WM_SETFOCUS, WM_ENABLE, WM_SHOWWINDOW но почему то не одно не канает все по нулям(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2011, 08:03
Помогаю со студенческими работами здесь

Active Directory - завершение сеанса активного пользователя в сети
Всем доброго дня! Вопрос мучает меня, как сисадмина, очень давно: на работе построена сеть на базе Windows Server 2008 r2 и Active...

Как правильно сохранить данные в таблицы, чтобы их сразу же можно было использовать?
Вообщем есть 2 таблицы, который созданы в локальной БД c#. Я открываю exe файл программы и в эти две таблицы спокойно заношу данные и потом...

Система не загружается, не восстанавливается; можно ли сохранить данные перед переустановкой
В общем запустил ПК, как вдруг выдает ошибку перед загрузкой win7, типа нету ОС. Нашел и вставил лицензионный диск, перезапустил ПК и сразу...

Как сделать так чтобы по нажатию на кнопку можно было сохранить данные из базы в файл?
как сделать так чтобы по нажатию на кнопку можно было сохранить данные из базы в файл, причем юзер должен выбирать куда ему сохранять...

Как сохранить промежуточные данные перед выводом на экран?
здравствуйте. нужна помощь. как переписать For i = 1 To n If Mid(s, i, 1) <> " " And Mid(s, i, 1) <> "." Then ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru