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

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

28.01.2011, 08:21. Просмотров 4008. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2011, 08:21
Ответы с готовыми решениями:

Удаленное завершение сеанса пользователя
Здравствуйте. 1) Я накидал вот такой батник, для удаленного завершения сеанса пользователя....

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

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

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

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

Добавлено через 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
8691 / 3643 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 15:05 4
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  [ТС] 5
аа да верно причем начало сохранять почему то именно после того как я закоментил строки
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
8691 / 3643 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 16:09 6
А нафига ты
это
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  [ТС] 7
О спасибо все заработало Скажите а для того чтобы сделать чтобы она автоматически запускалась при загрузке ОС нужно тоже какое то событие отлавливать? ( просто так то в автозагрузку ее не трудно поставить а вот как сделать чтобы она еще и работала при этом правильно это уже проблема
0
Почетный модератор
Эксперт .NET
8691 / 3643 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 16:49 8
Цитата Сообщение от timur2008 Посмотреть сообщение
Скажите а для того чтобы сделать чтобы она автоматически запускалась при загрузке ОС нужно тоже какое то событие отлавливать?
Нет, надо просто добавить программу в автозагрузку.
Цитата Сообщение от timur2008 Посмотреть сообщение
как сделать чтобы она еще и работала при этом правильно это уже проблема
Не знаю - подумай Твоя ж программа )
1
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
28.01.2011, 16:58  [ТС] 9
А есть вообще какой нибудь нормальный справочник по API где указываются константы виндовс наподобие
C#
1
2
WM_QUERYENDSESSION = 0x11;
                WM_ENDSESSION = 0x16;
?
0
Почетный модератор
Эксперт .NET
8691 / 3643 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 17:05 10
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  [ТС] 11
Аа понятно спасибо , щас посмотрим

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

Ещё раз прочитай мой предыдущий пост.
1.
Как можно отследить завершение сеанса пользователя чтобы успеть перед этим сохранить данные
2.
Как можно отследить завершение сеанса пользователя чтобы успеть перед этим сохранить данные
3.
Как можно отследить завершение сеанса пользователя чтобы успеть перед этим сохранить данные
0
2 / 2 / 2
Регистрация: 11.02.2010
Сообщений: 252
29.01.2011, 07:38  [ТС] 13
Блин я нашел этот 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
8691 / 3643 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2011, 14:27 14
Цитата Сообщение от timur2008 Посмотреть сообщение
Блин я нашел этот WM_STARTSESSION
Такой константы не существует.
Цитата Сообщение от timur2008 Посмотреть сообщение
DBT_USERDEFINED
Это из другой оперы.

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

Добавлено через 14 часов 18 минут
Нет не получаеся , когда я вручную запускаю программу ( а не с помощью авторана) то все сохраняется нормально, но если пробывать ее запускать через автозагрузку то ничего не сохраняет . Я пытался использовать события WM_SETFOCUS, WM_ENABLE, WM_SHOWWINDOW но почему то не одно не канает все по нулям(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2011, 08:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.