Вверх ↑
Этот топик читают: Гость
Ответов: 34
Рейтинг: 0
#1: 2019-01-23 16:32:20 ЛС | профиль | цитата
Можно ли как то узнать у приложения\процесса что то вроде времени бездействия?
т.е. есть например chrome, его свернули и работают дальше в офисе, надо что бы спустя 5 минут chrome закрылся, если пользователь к нему не обращается, если обратился, то счетчик обнуляется.
ПРоблема только в том как можно получит этот простой конкретного приложения? и можно ли?
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 1925
Рейтинг: 172
#2: 2019-01-24 19:24:02 ЛС | профиль | цитата
Если своего, то http://forum.hiasm.com/topic/8707.
карма: 9
0
Ответов: 5227
Рейтинг: 585
#3: 2019-01-24 19:30:48 ЛС | профиль | цитата
наверняка есть какое то сообщение и его надо тупо ловить (это не утверждение но мысли в слух )

Редактировалось 1 раз(а), последний 2019-01-24 19:31:01
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1925
Рейтинг: 172
#4: 2019-01-24 19:39:09 ЛС | профиль | цитата
andrestudio, сообщения-то простые: WM_KEYFIRST..WM_KEYLAST, WM_MOUSEFIRST..WM_MOUSELAST. Остаётся только отлавливать их для конкретного приложения, видимо, какие-то хуки ставить...
карма: 9
0
Ответов: 5227
Рейтинг: 585
#5: 2019-01-24 20:42:16 ЛС | профиль | цитата
ну так вроде делал такое http://forum.hiasm.com/topic/57290
есть более новое решение (здесь его не публиковал кажись) которое можно в компонент завернуть.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#6: 2019-01-25 18:25:40 ЛС | профиль | цитата
andrestudio писал(а):
есть более новое решение (здесь его не публиковал кажись) которое можно в компонент завернуть.

Вообще-то это интересная тема, и че не завернул в компонент, хотя бы код выложил посмотреть.
карма: 22

0
Ответов: 5227
Рейтинг: 585
#7: 2019-01-26 09:26:10 ЛС | профиль | цитата
nesco писал(а):
и че не завернул в компонент

Ага, и типа на svn будет компонент от andrestudio? Чёт верится с трудом
nesco писал(а):
хотя бы код выложил посмотреть

А чтож не выложить, пожалуйста

Add(MainForm,10133415,343,140)
{
Width=407
Height=241
Caption="Hook IC demo"
Point(Handle)
Point(onKeyDown)
}
Add(InlineCode,2108213,343,210)
{
WorkPoints=#11:doStartHook|10:doStopHook|
EventPoints=#7:onEvent|
DataPoints=#4:hwnd|
Code=#25:// autor IC - andrestudio|15:unit HiAsmUnit;|0:|9:interface|0:|59:uses Windows, Kol, Share, Debug, Messages{, CallbackThunk};|0:|4:type|33: TCallbackThunk = class(TObject)|9: private|26: FCallAddress: Pointer;|22: FProcPtr: Pointer;|25: FSavedFlag: LongWord;|22: FSelfPtr: Pointer;|37: function GetCallAddress: Pointer;|8: public|46: constructor Create(pSelf, pProc: Pointer);|33: destructor Destroy; override;|20: procedure Clear;|54: property CallAddress: Pointer read GetCallAddress;|8: end; |2: |4:type|29: THiAsmClass = class(TDebug)|9: private|27: FThunk: TCallbackThunk;|8: public|34: hwnd, onEvent: THI_Event; |16: Child: Hwnd;|25: NewAddress: Pointer; |24: OldAddress: LongInt;|23: constructor Create;|55: procedure doStartHook(var _Data:TData; Index:word);|54: procedure doStopHook(var _Data:TData; Index:word);|59: function ChildCallback(HWnd: THandle; Msg: Cardinal; |64: WParam, LParam: Integer): Cardinal; Stdcall; |6: end;|2: |0:|14:implementation|0:|67:function THiAsmClass.ChildCallback(HWnd: THandle; Msg: Cardinal; |61: WParam, LParam: Integer): Cardinal; Stdcall; |8:begin |15: case Msg of |59: WM_LBUTTONDOWN: _hi_onEvent(onEvent,'onMouse_LDown');|59: WM_RBUTTONDOWN: _hi_onEvent(onEvent,'onMouse_RDown');|58: WM_LBUTTONUP: _hi_onEvent(onEvent,'onMouse_LUp'); |60: WM_RBUTTONUP: _hi_onEvent(onEvent,'onMouse_RUp'); |71: WM_LBUTTONDBLCLK: _hi_onEvent(onEvent,'onDblClick'); |72: WM_MOUSEMOVE: _hi_onEvent(onEvent,'onMouseMove'); |73: WM_MOUSEWHEEL: _hi_onEvent(onEvent,'onMouseWheel'); |6: |53: WM_KEYUP: _hi_onEvent(onEvent,'onKeyUp');|55: WM_KEYDOWN: _hi_onEvent(onEvent,'onKeyDown');|53: WM_PAINT: _hi_onEvent(onEvent,'onPaint');|54: WM_SIZE: _hi_onEvent(onEvent,'onResize');|56: WM_SETFOCUS: _hi_onEvent(onEvent,'onSetFocus');|57: WM_KILLFOCUS: _hi_onEvent(onEvent,'onKillFocus');|106: WM_SHOWWINDOW: _hi_onEvent(onEvent,'onShowWINDOW'); |6: end;|7: |73: Result := CallWindowProc(Pointer(GetWindowLong(HWnd, GWL_USERDATA)), |65: Hwnd, Msg, WParam, LParam); |5:end; |11: |31:constructor THiAsmClass.Create;|5:begin|32: Child := 0; NewAddress := nil;|52: // создаём переходник на THiAsmClass.ChildCallback|68: FThunk := TCallbackThunk.Create(Self, @THiAsmClass.ChildCallback);|4:end;|0:|34:procedure THiAsmClass.doStartHook;|5:begin|26: if Child <> 0 then Exit;|32: Child := 0; NewAddress := nil;|35: Child := ReadInteger(_Data,hwnd);|50: OldAddress := GetWindowLong(Child, GWL_WNDPROC);|79: // получаем адрес на процедуру или функцию сласса с произвольными параметрами|35: NewAddress := FThunk.CallAddress;|32: if NewAddress = nil then Exit;|20: // ставим ловушку |39: SetWindowLong(Child, GWL_USERDATA, |63: SetWindowLong(Child, GWL_WNDPROC, LongInt(NewAddress))); |4:end;|0:|33:procedure THiAsmClass.doStopHook;|5:begin|25: if Child = 0 then Exit;|42: // вернём родную калбэк функцию на место|39: SetWindowLong(Child, GWL_USERDATA, |51: SetWindowLong(Child, GWL_WNDPROC, OldAddress));|24: // почистим за собой |15: FThunk.Clear;|32: Child := 0; NewAddress := nil;|4:end;|0:|80://------------------------------------------------------------------------------|69:// сам переходник вынес сюда из CallbackThunk.pas (работает и в FPC)|4:type|19: PThunk = ^TThunk;|24: TThunk = packed record|17: POPEDX: Byte;|17: MOVEAX: Byte;|21: SelfPtr: Pointer;|18: PUSHEAX: Byte;|18: PUSHEDX: Byte;|14: JMP: Byte;|23: JmpOffset: Integer;|6: end;|0:|57:constructor TCallbackThunk.Create(pSelf, pProc: Pointer);|5:begin|22: FCallAddress := nil;|20: FSelfPtr := pSelf;|20: FProcPtr := pProc;|4:end;|0:|34:destructor TCallbackThunk.Destroy;|5:begin|8: Clear;|20: inherited Destroy;|4:end;|0:|31:procedure TCallbackThunk.Clear;|3:var|18: SaveFlag: DWORD;|5:begin|36: if @FCallAddress <> nil then begin|57: VirtualProtect(PThunk(@FCallAddress), SizeOf(TThunk),|29: FSavedFlag, @SaveFlag);|46: VirtualFree(FCallAddress, 0, MEM_RELEASE);|24: FCallAddress := nil;|20: FSavedFlag := 0;|6: end;|4:end;|0:|48:function TCallbackThunk.GetCallAddress: Pointer;|5:begin|34: if FCallAddress = nil then begin|82: FCallAddress := VirtualAlloc(nil, SizeOf(TThunk), MEM_COMMIT, PAGE_READWRITE);|39: with PThunk(FCallAddress)^ do begin|20: POPEDX := $5A;|20: MOVEAX := $B8;|26: SelfPtr := FSelfPtr;|21: PUSHEAX := $50;|21: PUSHEDX := $52;|17: JMP := $E9;|57: JmpOffset := Integer(FProcPtr) - Integer(@JMP) - 5;|8: end;|74: if not VirtualProtect(FCallAddress, SizeOf(TThunk), PAGE_EXECUTE_READ,|30: @FSavedFlag) then begin|26: FCallAddress := nil;|8: end;|6: end;|25: Result := FCallAddress;|4:end;|0:|4:end.|2: |
link(onEvent,338180:doEvent,[])
link(hwnd,10133415:Handle,[])
}
Add(Button,3878981,252,210)
{
Left=15
Top=25
Width=105
Caption="StartHook"
link(onClick,2108213:doStartHook,[])
}
Add(Debug,338180,448,210)
{
}
Add(Button,7773153,252,252)
{
Left=15
Top=60
Width=105
Caption="StopHook"
link(onClick,2108213:doStopHook,[(311,258)(311,223)])
}

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#8: 2019-01-26 12:01:05 ЛС | профиль | цитата
andrestudio писал(а):
компонент от andrestudio

А почему бы и нет?

--- Добавлено в 2019-01-26 12:12:15

Че-то у примера какая-то корявая реакция на закрытие формы после активации хука, пару секунд точно думает.

--- Добавлено в 2019-01-26 12:24:41

Интересно, а есть ли API, который выдает активность окна без всяких хуков, на уровне ядра, по типу активности файловой системы?

--- Добавлено в 2019-01-26 12:48:51

А можно еще и так определять активность своего приложения

Схема

Add(MainForm,10133415,455,469)
{
Width=407
Height=241
Point(Handle)
Point(onClose)
link(onCreate,769176:doFindName,[])
link(onClose,769176:doStopCPUUsage,[(529,496)(529,503)])
}
Add(EnumProcess,769176,546,462)
{
Point(Name)
Point(doFindName)
Point(doStartCPUUsage)
Point(doStopCPUUsage)
Point(onFind)
Point(onCPUUsage)
link(Name,10834283:GetData,[])
link(onFind,769176:doStartCPUUsage,[(585,475)(585,517)(536,517)(536,496)])
link(onCPUUsage,3487722:doConvert,[])
}
Add(Application,13015678,602,357)
{
}
Add(FilePartElm,15838806,602,406)
{
link(onPart,10834283:doData,[(655,412)(655,349)(543,349)(543,412)])
link(FileName,13015678:AppFileName,[])
}
Add(EventFromData,10834283,553,406)
{
link(onEvent,15838806:doPart,[])
}
Add(Convertor,3487722,602,476)
{
Mode=2
link(onResult,4376670:doEvent1,[])
}
Add(Hub,4376670,658,476)
{
link(onEvent1,15242821:doCompare,[])
link(onEvent2,10133415:doCaption,[(683,489)(683,524)(445,524)(445,475)])
}
Add(If_else,15242821,700,476)
{
Op2=Integer(0)
link(onTrue,2141830:doEvent1,[(739,482)(739,454)])
link(onFalse,11025862:doStop,[])
}
Add(Timer,11025862,791,476)
{
Interval=10000
Enable=1
AutoStop=1
Point(onStop)
link(onTimer,10133415:doClose,[(830,482)(830,531)(438,531)(438,496)])
link(onStop,4410278:doOff,[(844,489)(844,447)])
}
Add(Hub,2141830,749,448)
{
link(onEvent1,4410278:doOn,[])
link(onEvent2,11025862:doTimer,[(781,461)(781,482)])
}
Add(LED,4410278,868,434)
{
Left=25
Top=15
}

В принципе, такая схема может отлавливать активность и других приложений.

Редактировалось 6 раз(а), последний 2019-01-26 13:00:38
карма: 22

0
Ответов: 2059
Рейтинг: 131
#9: 2019-01-26 13:09:13 ЛС | профиль | цитата
Как-то интересовался этой темой.
Подходящего,в виде Callback-ов, ничего не нашел.
Есть какая-то функция и функция-Ex, сейчас не помню, которая возвращает состояние объекта - ожидание, активный не активный, но...
Но ей, я так понимаю, надо мониторить постоянно мониторить объект, чтобы понять как долго он находится в том, или ином состоянии.
С таким-же успехом можно мониторить загрузку процессора и изменение памяти в процессе - полная ерунда получается.
карма: 6

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#10: 2019-01-26 13:10:05 ЛС | профиль | цитата
flint2 писал(а):
С таким-же успехом можно мониторить загрузку процессора

Что и показано у меня в примере.
карма: 22

0
Ответов: 2059
Рейтинг: 131
#11: 2019-01-26 13:19:43 ЛС | профиль | цитата
Крайне низка вероятность, что в момент опроса будет зафиксировано изменение.
Я даже объединял по or загрузку - наличие изменения процессора и памяти.
Опрос должен быть раз пять в секунду, а то и больше. Всё, что с таймером, не изящно получается.

Редактировалось 1 раз(а), последний 2019-01-26 13:20:40
карма: 6

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#12: 2019-01-26 14:00:20 ЛС | профиль | цитата
flint2 писал(а):
Всё, что с таймером, не изящно получается.

В примере работает не таймер, там встроенный параллельный поток с нулевой задержкой.
flint2 писал(а):
Опрос должен быть раз пять в секунду, а то и больше.

Если к приложению никто не обращается или его загрузка ниже определенного значения, то пофиг какой там опрос. Винда не риал-тайм система (плюс минус лаптя), и не надо из нее выдавливать то, на что она не способна по определению.
У таймера, предположим, установлена минута на закрытие, какая там разница на сколько миллисекунд раньше или позже произойдет закрытие приложения.
Пример показывает как реализовать отслеживание конкретно по заданному ТС вопросу
ZloiDed писал(а):
Можно ли как то узнать у приложения\процесса что то вроде времени бездействия?
т.е. есть например chrome, его свернули и работают дальше в офисе, надо что бы спустя 5 минут chrome закрылся, если пользователь к нему не обращается, если обратился, то счетчик обнуляется.

5 минут, Карл, какие там реал-тайм миллисекунды? С Хромом хреново другое -- у него все окна это независимые процессы и надо отслеживать общую загрузку всех этих процессов. Ну есть, конечно, вероятность, что ты попытаешься активировать приложение, а ему уже пошла команда на закрытие, но нефиг тогда мять мягкие места столько времени.

Редактировалось 3 раз(а), последний 2019-01-26 14:06:45
карма: 22

0
Ответов: 2059
Рейтинг: 131
#13: 2019-01-26 14:53:24 ЛС | профиль | цитата
5 минут, Карл, какие там реал-тайм миллисекунды?

Я про то, что в один момент загрузка есть, а потом на две-три секунды падает до нуля, а следующие опять возросла. И надо-же, нас угораздило попасть в момент, когда она упала до нуля.
Что касается chrome можно и по хуку и по загрузке, сам хотел предложить.
А если не привязываться к частному случаю...
Вот пример:
Минут двадцать назад запустил программку - она ищет сочетания слов на определённую тему в архиве библиотеки.
Библиотека 142 Г. работать это дело будет 3-5 часов.
Фокуса на окошке тоже не будет такое-же время, так что хук 'мимо денег'.
Активность, что показывают средства Windows, показывают всплески загрузки в нечастые моменты открытия\распаковки файлов, и то, когда мониторинг попадает на этот момент.

Редактировалось 1 раз(а), последний 2019-01-26 14:58:07
карма: 6

0
Ответов: 5227
Рейтинг: 585
#14: 2019-01-26 14:57:02 ЛС | профиль | цитата
Я вообще не понимаю о чём тут дрова колют. Ну есть тут инцидент и что Ведь и так ясно что частный случай зачем дрова то колоть Моя цель была другой. Из ТУЕВА ХУЧА горизонтальных связей сделать одну вертикальную в СВОЁМ приложении Ладно, можно считать что опять мухи на слонов напали.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 131
#15: 2019-01-26 15:10:34 ЛС | профиль | цитата
Ведь и так ясно что частный случай зачем дрова то колоть

В частном случае и вопросов не возникает. В частном случае и костыли по росту можно подобрать.
Хотелось-бы научиться ловить рыбу.
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)