1

Тема: AHK: Оповещение об активности окна более минуты

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

Такой вариант не работает:

loop{
WinWait, ahk_class notepad
StartTime := A_TickCount
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime > 60000)
	MsgBox % ElapsedTime
}
return

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

SetTimer, WaitCopying, 100
WaitCopying:
winName:="ahk_class OperationStatusWindow"
while !(WinExist(winName))
	Sleep, 250
	StartTime := A_TickCount
WinWaitClose, %winName%
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime > 180000) ; 3 min
	{
	ElapsedTimeConvert := SecToHHMMSS(ElapsedTime // 1000)
	MsgBox, , File System, Copying is Finished!`nElapsed time: %ElapsedTimeConvert%
}
return

SecToHHMMSS(Sec) {
	OldFormat := A_FormatFloat
	SetFormat, Float, 02.0
	Hrs  := Sec//3600/1
	Min := Mod(Sec//60, 60)/1
	Sec := Mod(Sec,60)/1
	SetFormat, Float, %OldFormat%
	Return (Hrs ? Hrs ":" : "") Min ":" Sec
}

Спасибо!

2

Re: AHK: Оповещение об активности окна более минуты

По первому вопросу. Так может:

loop{
WinWait, ahk_class Notepad
StartTime := A_TickCount
Sleep, 1000
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime < 60000)
	MsgBox % ElapsedTime
}
return

По второму, не вникал особо.

3

Re: AHK: Оповещение об активности окна более минуты

svoboden, Спасибо! Вопрос один, имелось в виду желание расширить функционал, а именно добавить возможность складывать общее времмя активности окна.

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

4 (изменено: svoboden, 2017-03-03 15:43:36)

Re: AHK: Оповещение об активности окна более минуты

При активности 11 секунд срабатывает:

WinWait, ahk_class Notepad

all_time := "18" ; 18 - это 11 секунд
start_time := A_TickCount
all_time := (start_time+all_time*600) 

Loop 
{
var := (all_time-A_TickCount)       
if var <= 0 
break
}

MsgBox  12
return

5 (изменено: Malcev, 2017-01-11 07:34:19)

Re: AHK: Оповещение об активности окна более минуты

ElapsedTime := 0
loop
{
   WinWaitActive, ahk_class Notepad
   StartTime := A_TickCount - ElapsedTime
   loop
   {
      tooltip % ElapsedTime
      IfWinNotActive, ahk_class Notepad
         break
      ElapsedTime := A_TickCount - StartTime
      if (ElapsedTime > 60000)
      {
         MsgBox % ElapsedTime
         return
      }
      sleep 10
   }
}

6

Re: AHK: Оповещение об активности окна более минуты

Malcev, то, что нужно! Спасибо!

7

Re: AHK: Оповещение об активности окна более минуты

Malcev, ужас, не надо так.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Оповещение об активности окна более минуты

Ты имеешь в виду, то что процессор нагружает? Добвил sleep.
Или сам подход?

9

Re: AHK: Оповещение об активности окна более минуты

Malcev пишет:

Ты имеешь в виду, то что процессор нагружает?

Конечно. Подход тоже не айс — постоянный цикл, но зависит, должен ли скрипт что-то ещё делать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Оповещение об активности окна более минуты

Циклом так проще:

ActiveTime := 5  ; в секундах
winClass := "ahk_class Notepad"
ElapsedTime := 0

Loop  {
   WinWaitActive, % winClass
   StartTime := A_TickCount/1000 - ElapsedTime
   WinWaitNotActive,,, ActiveTime - ElapsedTime
   if ErrorLevel  {
      MsgBox, TimeOut
      ExitApp
   }
   ElapsedTime := A_TickCount/1000 - StartTime
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: svoboden, 2017-01-11 10:00:45)

Re: AHK: Оповещение об активности окна более минуты

По-моему, вариант malcev`a работает немного лучше.

12

Re: AHK: Оповещение об активности окна более минуты

Не обратил внимания на то, что процессор сильно нагружался, но с паузой, кажется, такого нет. Вариант от teadrinker выглядит лаконичнее, разницы в работе, на первый взгляд, не замечаю. Разве что, нет отображения стечения времени в ToolTip. А это тоже, пожалуй, необходимый функционал. Но лучше не в ToolTip. Я попробовал взять визуальное оформление таймера из этого сценария (кнопка Start/Stop должна ставить на паузу ожидание активности блокнота), но опять же, не получается прикрутить должным образом:

#SingleInstance FORCE

#NoEnv
SetBatchLines, -1
; Some variables
ElapsedTime := A_YYYY                                 ; initialize ElapsedTime, it will be treated as YYYY0101000000
BalanceTime := 0                                      ; initialize BalanceTime (time not counted yet)
; Tray menu
Menu, Tray, NoStandard                                ; clear the tray menu for customizing
Menu, Tray, Add, Quit, AppExit                        ; add item "Quit" to call AppExit
Menu, Tray, Default, Quit                             ; double-click on the tray icon will call "Quit"
Menu, Tray, Tip, % " AHK short-time Stopwatch "       ; add a nice tool tip
; GUI
Gui, +LastFound ; Added
WinSet, TransColor, FFFFFF 100 ; Added
;
Gui, +ToolWindow -Caption +AlwaysOnTop                ; made some changes for relative positioning and sizing
Gui, Margin, 0, 0                                     ; http://l.autohotkey....ui.htm#Position
Gui, Font, S32 CDefault Bold, Verdana
Gui, Add, Text, Center vDisplayTime, 00:00
Gui, Font, S12, Verdana
Gui, Add, Button, x+0 yp w60 hp vBtnStartStop gStartStop Default, Start`nStop
Gui, Add, Button, x+0 yp w60 hp vBtnReset gReset, Reset
Gui, Add, Button, x+0 yp w60 hp gAppExit, Quit
Gui, Show, , Stop Watch
Gosub, StartStop
Return
; Exit label
AppExit:
ExitApp
; BtnStartStop label
StartStop:
   GuiControlGet, BtnStartStop                        ; get the caption of the button
   If (BtnStartStop = "Start`nStop") {                ; if it is "Start`nStop"
      StartTickCount := A_TickCount - BalanceTime     ; initialize StartTickCount
      SetTimer, StopWatch, 10                         ; start the timer called every 10 ms to be accurate
      GuiControl, , BtnStartStop, Stop                ; set the caption to Stop
   } Else {                                           ; it should be "Stop"
      BalanceTime := A_TickCount - StartTickCount     ; memorize the balance time not counted yet
      SetTimer, StopWatch, Off                        ; stop the timer
      GuiControl, , BtnStartStop, Start`nStop         ; set the caption to "Start`nStop"
   }
Return
; BtnReset label
Reset:
   SetTimer, StopWatch, Off                           ; stop the timer
   GuiControl, , BtnStartStop, Start`nStop            ; set the caption of BtnStartStop to "Start`nStop"
   GuiControl, , DisplayTime, 00:00                   ; initialize DisplayTime
   ElapsedTime := A_YYYY                              ; initialize ElapsedTime, it will be treated as YYYY0101000000
   BalanceTime := 0                                   ; initialize BalanceTime
   GuiControl, Focus, BtnStartStop                    ; set the focus on BtnStartStop
   GuiControl, -Default, BtnReset                     ; remove the BS_DEFPUSHBUTTON (default) style
   GuiControl, +Default, BtnStartStop                 ; set the BS_DEFPUSHBUTTON (default) style
Return
; Timer routine
StopWatch:
   If ((A_TickCount - StartTickCount) >= 1000) {      ; if current tickcount - StartTickCount >= 1000 (i.e. 1 second)
      StartTickCount += 1000                          ; add 1000 ms (1 second) to StartTickCount
      ElapsedTime += 1, S                             ; add 1 second to ElapsedTime
      FormatTime, DisplayTime, %ElapsedTime%, mm:ss   ; format ElapsedTime to mm:ss
      GuiControl, , DisplayTime, %DisplayTime%        ; update DisplayTime
   }
Return

Помогите это сделать, пожалуйста.