Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время работы, конечное время 
:(
    Опции темы
Springtime
Дата 12.7.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 25.10.2006
Где: Россия, Тюмень

Репутация: нет
Всего: 2



Всем привет.
Помогите пожалуйста решить мега-задачу.

в общем делаю прогу которая должна собирать время работы с окном в винде. То есть сколько пользователь работает в том или ином окне и скидывает данные на SQL.
сама функция - 

Код

private Inf GetWindow()
        {
            Inf inf = new Inf();
            handle = GetForegroundWindow();
            GetWindowText(handle, STR, 256);
            inf.startTime = DateTime.Now;
            GetWindowThreadProcessId(handle, out lpwdProcessId);
            process = Process.GetProcessById((int)lpwdProcessId);
            inf.prcName = process.ProcessName;
            inf.MachineName = System.Environment.MachineName.ToString();
            inf.userName = System.Environment.UserName.ToString();
            inf.banner = STR.ToString();
            inf.handle = int.Parse(handle.ToString());
            return inf;
        }


возвращает структуру

Код

struct Inf
    {
        public string prcName;
        public string userName;
        public string MachineName;
        public DateTime startTime;
        public DateTime endTime;
        public string banner;
        public int handle;
    }



проблема в том что никак не могу допереть как её организовать, то есть как сделать что бы она вычисляла время работы с окном и данные скидывала сразу же после смены окна (как скидывала это понятно). 
У нас есть начальное время, это хорошо, но как вычислить время конечно время, причём это время мы не должны браться из начального времени нового окна. 
Заранее спасибо. 

Это сообщение отредактировал(а) Springtime - 12.7.2009, 13:05
--------------------
ICQ: 1fe410f46e7f48f6c721bc866d8294a2
PM MAIL ICQ   Вверх
maxdiver
Дата 12.7.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



o_O Для каждого окна (по хэндлу) хранить время его открытия?
PM MAIL WWW ICQ   Вверх
Springtime
Дата 12.7.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 25.10.2006
Где: Россия, Тюмень

Репутация: нет
Всего: 2



да и время завершения работы с ним, причём независимо от времени перехода на новое окно, то есть можно было бы сделать что бы время завершения работы с окном - это время начала работы с новым окном, но так не катит,  т.к. есть ещё паузы, надо как то инекрементировать время начала работы с окном и потом его записть во время окончания работы с окном, по событию перехода на новое окно
--------------------
ICQ: 1fe410f46e7f48f6c721bc866d8294a2
PM MAIL ICQ   Вверх
Springtime
Дата 14.7.2009, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 25.10.2006
Где: Россия, Тюмень

Репутация: нет
Всего: 2



В нынешнем варианте время завершения работы с окном - есть время начала с работы новым окном (с новым хендлом). Но проблема в том что есть обеды, во время начала которого мы должны прерывать время работы с окном. То есть допустим окно активировано в 12:50, обед у нас c 13:00-14:00. Функция опрашивает раз в секунду, не сменилось ли окно, если сменилось то отправляем данные. Идёт проверка не наступил ли по времени 13 (время обеда). Если наступило, то опрос больше не происходит. Следующее начало опроса в 14. Но у нас тогда выходит что время начала с окном 12:50 (далее наступает пауза с 13 до 14) и если пользователь сменил окно во время обеда, то время завершения работы с окном 14:00. А надо что бы время завершения было 12:59.

Код

 class ClassOne : ApplicationContext
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        private static extern int GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
        [DllImport("user32.dll")]
        public static extern int GetWindowText(IntPtr hwnd, StringBuilder bld, int size);

        IntPtr handle;
        uint lpwdProcessId;
        Process process;
        info wnd = new info();
        StringBuilder STR = new StringBuilder(256);

        public string InfoSQL()
        {
            String sqlconn="";
            try
            {
                sqlconn = ConfigurationManager.ConnectionStrings["LifeCodeServiceLog"].ConnectionString;
            }
            catch (NullReferenceException)
            {
                System.Windows.Forms.MessageBox.Show("Не найден конфигурационный файл.");
                Process currentPr = Process.GetCurrentProcess();
                currentPr.Kill();
            }
            return sqlconn;
        }
        public ClassOne()
        {
            Initialize();
        }
        public void Initialize()
        {
            NonTwoStart();
            wnd = GetWindow();
            System.Timers.Timer timer1 = new System.Timers.Timer();
            timer1.Enabled = true;
            timer1.Interval = 1000;
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
        }
        private void timer1_Elapsed(object sender, EventArgs e)
        {
            if (ShudlTime())
            {
                PrcChg(GetWindow());
            }
        }
        public struct info
        {
            public string prcName;
            public string userName;
            public string MachineName;
            public DateTime startTime;
            public DateTime endTime;
            public string banner;
            public int handle;
        }
        public struct infownd
        {
            public string prcName;
            public string userName;
            public string MachineName;
            public DateTime endTime;
            public DateTime StartTime;
            public string banner;
        }
        public void LogMessage(infownd Msg)
        {
                SqlConnection connection = null;
                SqlCommand command = null;
            using(connection = new SqlConnection(InfoSQL()))
            {
                command = new SqlCommand("INSERT INTO ProgrammJob (Computer, CurrentUser, NameProcess, Banner, StartDataTimeProcess, EndDataTimeProcess) VALUES ('" + Msg.MachineName + "','" + Msg.userName + "','" + Msg.prcName + "','" + Msg.banner + "','" + Msg.StartTime.ToString("yyy-MM-d HH:mm:ss") + "','" + Msg.endTime.ToString("yyy-MM-d HH:mm:ss") + "')", connection);
                connection.Open();
                int numrows = command.ExecuteNonQuery();
            }
        }
        public info GetWindow()
        {
            info inf = new info();
            handle = GetForegroundWindow();
            GetWindowText(handle, STR, 256);
            inf.startTime = DateTime.Now;
            GetWindowThreadProcessId(handle, out lpwdProcessId);
            process = Process.GetProcessById((int)lpwdProcessId);
            inf.prcName = process.ProcessName;
            inf.MachineName = System.Environment.MachineName.ToString();
            inf.userName = System.Environment.UserName.ToString();
            inf.banner = STR.ToString();
            inf.handle = int.Parse(handle.ToString());
            return inf;
        }
        public void PrcChg(info window)
        {
            infownd infwnd = new infownd();
            if (wnd.handle != window.handle)
            {
                infwnd = returnwnd(wnd, window);
                LogMessage(infwnd);
            }
        }
        public infownd returnwnd(info inf, info inf2)
        {
            DateTime dt = new DateTime();
            dt = DateTime.Now;

            infownd infwnd = new infownd();
            infwnd.prcName = inf.prcName;
            infwnd.MachineName = inf.MachineName;
            infwnd.userName = inf.userName;
            infwnd.banner = inf.banner;
            infwnd.StartTime = inf.endTime;
            

            infwnd.endTime = inf2.startTime;

            wnd.endTime = inf2.startTime;
            wnd.MachineName = inf2.MachineName;
            wnd.prcName = inf2.prcName;
            wnd.banner = inf2.banner;
            wnd.userName = inf2.userName;
            wnd.handle = inf2.handle;
            return infwnd;
        }
        public void NonTwoStart()
        {
            // Запрет на повторный запуск
            Process currentPr = Process.GetCurrentProcess();
            foreach (Process pr in Process.GetProcesses())
            {
                if ((pr.ProcessName == currentPr.ProcessName) && (pr.Id != currentPr.Id))
                {
                    currentPr.Kill();
                }
            }
        }
        public bool ShudlTime()
        {
            bool onofftime = false;
            DateTime timerun = new DateTime();
            timerun = DateTime.Now;
            int h = timerun.Hour;
            int m = timerun.Minute;
            if ((h > 7) & (h <= 17))
            {
                    if ((h < 13) | (h > 13))
                    {
                        onofftime = true;
                    }
                }
            return onofftime;
        }
        }

--------------------
ICQ: 1fe410f46e7f48f6c721bc866d8294a2
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.