1 (изменено: becauseim, 2015-07-01 05:01:52)

Тема: AHK: Отображение времени работы в программе

Привет! Поиск не привел к результату, но думаю, что-то подобное уже было создано. Программированием, к сожалению, не владею, но очень хотелось бы иметь сценарий, который бы отображал информацию о времени работы в определенной программе (одной). Важным моментом является то, чтобы учитывалось не просто время после открытия программы, а то время, в которое работа совершается, т.е. нажимаются клавиши и совершаются клики. Лог-файл был бы отличным решением, в идеале же иконка в трее с отображением информации в меню. Если кто-то уже встречал что-либо подобное, пожалуйста, подскажите, где можно забрать.

2

Re: AHK: Отображение времени работы в программе

Не совсем понятно определение

время, в которое работа совершается, т.е. нажимаются клавиши и совершаются клики.

Юзер открыл программу, кликнул мышкой, проходит какое-то время (5с, 20с, 1мин...). Как логгировать работу - активное время ~50мс, непосредствено сам клик. А если он в это время просто водит мышкой? Или просто сидит, усваивает информацию? Переключение на другие окна, рабочий стол, открытие диалогов чтения/записи в программе, как быть с ними.
Та же печать, что понять под работой - можно печатать 120зн/мин, а можно по 1 символу в час.

3 (изменено: becauseim, 2015-07-05 03:42:19)

Re: AHK: Отображение времени работы в программе

Irbis пишет:

Как логгировать работу - активное время ~50мс, непосредственно сам клик. А если он в это время просто водит мышкой?

Для этого можно установить задержку, например, в полминуты. Высокая точность не важна, главное, чтобы не учитывалось время в качестве рабочего тогда, когда ушел пить чай, например, а программу не закрыл. Т.е. погрешность в полминуты погоды не сделает. Движение курсора лучше не примыкать к основным действиям во избежание возобновления записи времени, когда после отлучки возобновляешь работу экрана, но не продолжаешь работать, а лишь сворачиваешь окно рабочей программы.

4

Re: AHK: Отображение времени работы в программе

Если такого скрипта еще нет, хотелось бы привлечь к данной теме внимание разработчиков, т.к. такой скрипт, по моему мнению, потенциально полезен и, хочется думать, достаточно прост для написания (касательно разработчиков).

5

Re: AHK: Отображение времени работы в программе

Нашел бесплатную программу под названием Motivate Clock, которая функционально превосходит заданную идею, например, возможностью экспорта результатов, а также учетом веб-сёрфинга, разделяя при этом сайты на рабочие и остальные. Но отсутствует важная составляющая, которая как раз таки заключается в режиме учета работы исключительно при взаимодейтсвии с программой. Т.е. рабочий режим приравнен к активности окна рабочей программы.

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

+ открыть спойлер

http://puu.sh/jWhWr/2d05f8a58f.png

6 (изменено: yalanne, 2015-09-01 21:13:11)

Re: AHK: Отображение времени работы в программе

WinMinimizeTimer("ahk_class Chrome_WidgetWin_1",    "0:0:15")
WinMinimizeTimer("ahk_class Notepad",    "0:1:3")

msgbox % WinMinimizeTimer()
#Persistent
WinMinimizeTimer(title="",timeWait="")
{
    Static Timers := []
    if !title and !timeWait
    {
    for i,k in Timers
        list .= (list? "`n" : "") k[2] "`t:`t" k[1]
    return list
    }
    loop,parse,timeWait,:
    time_ss+= ((A_Index=1)?A_LoopField*60*60: (A_Index=2)?A_LoopField*60: (A_Index=3)?A_LoopField: "")
    Timers.Insert([title,time_ss-1])
    if (Timers.MaxIndex()=1)
        SetTimer tm,1000
    return
    tm:
    loop % Timers.MaxIndex()
        if (Timers[A_Index][2] != 0)
            Timers[A_Index][2]--
        else
        {
            WinGet status,MinMax,% Timers[A_Index][1]
            WinGetTitle tl,% Timers[A_Index][1]
            if status in 0,1
            {
                WinMinimize % Timers[A_Index][1]
                traytip,% tl, % "Свёрнуто окно."
            }
            if status = -1
                traytip,% tl, % "окно уже свёрнуто."
        Timers.Remove(A_Index)
        }
    if !Timers.MaxIndex()
        SetTimer tm,off
    return
}

7

Re: AHK: Отображение времени работы в программе

yalanne, так понимаю, Notepad заменить на заголовок рабочей программы? Где задать время простоя? Можно ли сделать перечень рабочих (сврачиваемых через заданное время) программ?

8

Re: AHK: Отображение времени работы в программе

В функции первое поле это title окна, второе это время сворачивания, простоя нет. Так же немного изменил скрипт, если параметры не указанны то ответ будет время в секундах и на против title.

9

Re: AHK: Отображение времени работы в программе

Извиняюсь, меня немного смущает упоминание Notepad во второй строке. Где же это самое первое поле?
И если простоя нет, то как необходимо использовать данный функционал? Необходимо сворачивание после заданного времени после простоя.

10

Re: AHK: Отображение времени работы в программе

Тут два пимера в одном. Первая строка для гугл хром вторая для блокнота. У хрома  15 сек, у блокнота минута и 3 сек ожидание. Время указывается часы:минуты:секунды.

11 (изменено: becauseim, 2015-09-01 21:49:31)

Re: AHK: Отображение времени работы в программе

Работает! Но есть несколько моментов:
Открывается окно:
http://puu.sh/jWsfb/f47815956b.png

Появляется уведомление:
http://puu.sh/jWsiI/29caafdb23.png

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

12

Re: AHK: Отображение времени работы в программе

Если добавить в код yalanne проверку на AFK, и возможность повторных срабатываний, тогда так:

WinMinimizeTimer("ahk_exe Totalcmd.exe",    "0:0:15")
WinMinimizeTimer("ahk_exe notepad++.exe",    "0:0:10")

#Persistent
WinMinimizeTimer(title="",timeWait="")
{
    Static Timers := []
    if !title and !timeWait
    {
    for i,k in Timers
        list .= (list? "`n" : "") k[2] "`t:`t" k[1]
    return list
    }
    loop,parse,timeWait,:
    time_ss+= ((A_Index=1)?A_LoopField*60*60: (A_Index=2)?A_LoopField*60: (A_Index=3)?A_LoopField: "")
    Timers.Insert([title,time_ss-1])
    if (Timers.MaxIndex()=1)
        SetTimer tm,1000
    return
    tm:
    loop % Timers.MaxIndex()
        if (Timers[A_Index][2] * 1000 < A_TimeIdlePhysical)
        {
            WinGet status,MinMax,% Timers[A_Index][1]
            WinGetTitle tl,% Timers[A_Index][1]
            if status in 0,1
            {
                WinMinimize % Timers[A_Index][1]
                traytip,% tl, % "Свёрнуто окно."
            }
        }
    return
}

13

Re: AHK: Отображение времени работы в программе

Теперь работает, как задумано!

14

Re: AHK: Отображение времени работы в программе

Хотелось бы заменить сворачивание окна на переход в активный режим панели задач. Функционально одно и то же (учет рабочего времени приостанавливается), но нет необходимости разворачивать окно после каждого небольшого простоя. Можно ли это осуществить?

WinActivate, ahk_class Shell_TrayWnd

15 (изменено: Irbis, 2015-09-04 17:37:59)

Re: AHK: Отображение времени работы в программе

; ... Остальной код
if (Timers[A_Index][2] * 1000 < A_TimeIdlePhysical)
   WinActivate, ahk_class Shell_TrayWnd
return
}

В принципе, если не мониторить список приложений, а сделать так, чтоб при  простое всегда активизировалась панель задач, скрипт будет намного проще.

loop {
   if  !WinActive("ahk_class Shell_TrayWnd")&&(A_TimeIdlePhysical > 15000) ; 15c
   WinActivate, ahk_class Shell_TrayWnd
   sleep 1000
}

16

Re: AHK: Отображение времени работы в программе

Куда именно добавлять не понял, т.к. не заработало. А вот новый вариант работает отлично! Не знаю, почему сразу не пришел в голову такой вариант.

17

Re: AHK: Отображение времени работы в программе

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