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