Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Время работы


Автор: Springtime 12.7.2009, 13:04
Всем привет.
Помогите пожалуйста решить мега-задачу.

в общем делаю прогу которая должна собирать время работы с окном в винде. То есть сколько пользователь работает в том или ином окне и скидывает данные на 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;
    }



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

Автор: maxdiver 12.7.2009, 17:45
o_O Для каждого окна (по хэндлу) хранить время его открытия?

Автор: Springtime 12.7.2009, 19:51
да и время завершения работы с ним, причём независимо от времени перехода на новое окно, то есть можно было бы сделать что бы время завершения работы с окном - это время начала работы с новым окном, но так не катит,  т.к. есть ещё паузы, надо как то инекрементировать время начала работы с окном и потом его записть во время окончания работы с окном, по событию перехода на новое окно

Автор: Springtime 14.7.2009, 07:34
В нынешнем варианте время завершения работы с окном - есть время начала с работы новым окном (с новым хендлом). Но проблема в том что есть обеды, во время начала которого мы должны прерывать время работы с окном. То есть допустим окно активировано в 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;
        }
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)