Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отследить активность приложения 
:(
    Опции темы
AVGu
Дата 5.5.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Помогите разобраться в следующей ситуации:
Имеется приложение для которого мне необходимо определить состояние, когда оно ожидает ввода от пользователя и в это время чтобы работало мое приложение. По сути что-то типа WaitFor...Object но проблема в том что запускает это приложение пользователь, а не моя задача то есть я не могу сделать у себя CreateProcess
Вторая проблема в том что основной модуль (exe) этой программы ничего кроме вызовов dll не делает а собственно вся работа в dll и выполняется, а поэтому (как я понимаю)  нужно пользоваться WaitForMultipleObjects. 

Вот тут я и заткнулся (даже Рихтер не помогает, не говоря уж о DRKB  smile ... ведь для этой фунцкии нужно определить  массив handl'ов всех потоков активного приложения?! Или нет? не понимаю smile и не получается smile 
  
Может быть есть какие-то  другие способы определить состояние ожидания чужого приложения и всех его дочерних потоков?

Подскажите направление, куда копать?     
PM MAIL   Вверх
Snowy
Дата 5.5.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

Добавлено @ 16:16 
Вот. Посмотри здесь: http://forum.vingrad.ru/index.php?showtopic=86044 
PM MAIL   Вверх
AVGu
Дата 5.5.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Snowy 
GetForegroundWindow - не совсем то что мне нужно. Плохо прописал исходные условия.
Поясню подробнее.
1. Есть некая программа Prog.exe которая запускается пользователем. 
2. Есть моя программа MyProg.exe, запускается им же. 

Задача моей программы MyProg.exe - эмуляция действий пользователя в программе  Prog.exe - по сути там только нажать одну кнопку Process. То есть моя программа типа диспетчера, она готовит данные, она нажимает кнопки, ждет, опять готовит данные и т.д. 

Далее моя программа MyProg.exe должна "заснуть" пока Prog.exe обрабатывает данные, время обработки может изменяться от пары секунд до десятков секунд. 
Моя задача ждать пока Prog.exe отработает и перейдет к состоянию idle. 

Далее моя программа MyProg.exe снова готовит данные и эмулирует нажатие кнопки в программе  Prog.exe  ... та опять поехала работать а моя прога ждет. Так вот я не могу понять как отследить собственно момент завершения активности той второй программы и всех ее дочерних потоков. Все очень похоже на примеры из DRKB и прочих источников по реализации многопоточности но... потоки организую не я и не пойму как отследить активность или пассивность причем нескольких потоков.

Как на картинке из ProcessExplorer (см вложение). Там у процесса/потока есть некое состояние State: Wait: UserRequest

как то этот ProcessExplorer определяет что процесс в состоянии Wait....!? Как, не понимаю 
  

Это сообщение отредактировал(а) AVGu - 5.5.2006, 17:12

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  Process.jpg 32,25 Kb
PM MAIL   Вверх
Rouse_
Дата 5.5.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Делается это примерно таким образом.
NTQuerySystemInformation тип SystemProcessesAndThreadsInformation (пятерка). Получишь указатель на массив структур SYSTEM_PROCESS_INFORMATION. Последний параметр у каждой структуры будет указатель на массив структур SYSTEM_THREADS. У каждой этой структуры есть поле отображающее состояние State там находиться одно из следующих значений:
StateInitialized, StateReady, StateRunning, StateStandby, StateTerminated, StateWait, StateTransition, StateUnknown
(в порядке возрастания начиная с нуля) и WaitReason находящееся в одном из следующих значений:
Executive, FreePage, PageIn, PoolAllocation, DelayExecution, Suspended, UserRequest, WrExecutive, WrFreePage, WrPageIn, WrPoolAllocation, WrDelayExecution, WrSuspended, WrUserRequest, WrEventPair, WrQueue, WrLpcReceive, WrLpcReply, WrVirtualMemory, WrPageOut, WrRendezvous, Spare2, Spare3, Spare4, Spare5, Spare6, WrKernel, MaximumWaitReason
(в порядке возрастания начиная с нуля) 
Пример как вся эта кухня работает бери тут: http://rouse.front.ru/taskmon.zip
Добавь туда вот такой код:

Код

             if Temp^.ModuleName = nil then
                Caption := 'System Idle Process'
              else
                Caption := Temp^.ModuleName;

              Caption := Caption + ' ' + IntToStr(Temp^.ThreadInfo[0].State) + ':' + IntToStr(Temp^.ThreadInfo[0].WaitReason) ;

Получишь информацию по главному потоку smile 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
AVGu
Дата 5.5.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Rouse_, огромное спасибо 
есть у меня и taskmon, но я его че то не могу запустить
кстатиии у меня при компиляции ошибка вываливается  

Код

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {TMDemo},
  Unit2 in 'Unit2.pas';  //  а этого модуля нет! может так и нужно :) я его заремил конечно

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TTMDemo, TMDemo);
  Application.Run;
end.
 

но в  итоге у меня ничего не выводится и все...Delphi 5 у меня

читал хелп по NTQuerySystemInformation а там в самом конце что-типа "к функциям нужно обращаться через GetProcAddres "

во нашел цитату из MSDN 
Цитата

This function has no associated import library. You must use the LoadLibrary and GetProcAddress functions to dynamically link to Ntdll.dll.


в MSDN

ну ничего разберемся
по любому спасибо за помощь !

Юмор в том, что я как вопрос в форум написал так и начал потихоньку разбираться с этими потоками. Я не учел одной вещи, того, что

Код

handle  := CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, pID);
.....
Thread32First( handle, ThreadStruct );
...
Thread32Next( handle, ThreadStruct );

выдает ВСЕ потоки, мне думалось так что если я засылаю pID конкретного процесса так мне и дадут снимок потоков для этого процесса, а оказывается нужно фильтровать по OwnerID!
У Рихтера нашел пример! Дочитался таки  
 
PM MAIL   Вверх
Rouse_
Дата 5.5.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Ммм по поводу пятерки ничего не скажу, пример писался на семерке. По поводу GetProcAddres - не обязательно. Тут просто необходимо понимать под какую платформу идет приложение.
Данный пример работает только под NT. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
AVGu
Дата 6.5.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Rouse_, тогда вопрос, а то у меня сомнения закрались. Когда в документации идет упоминание о платформе NT имеется ввиду именно чистый  NT или 2000 тоже.  У меня 2000 Server а он же будто-бы продолжение классического NT!? Я правильно понимаю ситуацию или я ошибаюсь? А XP? Проясните пожалуйста.  
PM MAIL   Вверх
Rouse_
Дата 6.5.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата

Requires Windows XP or Windows 2000 Professional.
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
AVGu
Дата 6.5.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Rouse_

Под 2000 Server эта конструкция 

Код

NtQuerySystemInformation ( SystemProcessesAndThreadsInformation,  nil, 0, ReturnLength )


возвращает в ReturnLength ноль!  и в итоге taskmon ничего кроме CPU Usage не показывает.

м.б. это как то связано с безопасностью и правами доступа? 
PM MAIL   Вверх
Rouse_
Дата 6.5.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Не в курсе - нет под рукой сервера 2000 чтобы протестировать. Так что пытайся разобраться сам... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 6.5.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Кстати попробуй обьявить не NtQueryXXX а ZwQueryХХХ, я просто не знаю как там в сервере шлюзы реализованы, если мое предположение верное, то должно помочь... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
AVGu
Дата 6.5.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Rouse_,

неа ни Zw ни Nt не катит, причем на 2000 Prof Workstation тоже, уже пробовал (я старые твои посты внимательно читаю smile)  
 
разберусь! Нашел вот тут Как получить список процессов, включая скрытые  нашел ссылочку на Обнаружение скрытых процессов
там есть что-то по вызовам xxQuerySystemInformation для XP и 2000

не могу нигде найти описание для SYSTEM_INFORMATION_CLASS что там и как 

и еще вопрос Rouse_, у тебя в Taskmon SYSTEM_PROCESS_INFORMATION отличается от того, что описано в MSDN. Почему? Это результат препарирования системы или где-то есть информация полнее чем на Microsofte?  
PM MAIL   Вверх
Rouse_
Дата 6.5.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(AVGu @  6.5.2006,  18:02 Найти цитируемый пост)
у тебя в Taskmon SYSTEM_PROCESS_INFORMATION отличается от того, что описано в MSDN. Почему?

Это результат очень долгого изучения работы системы под отладчиком smile Работа у меня такая ;)
Ну и естественно часть информации из альтернативных источников, где сидят также любители поковыряться в ядре. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 6.5.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



А, кстати...
Цитата(AVGu @  6.5.2006,  18:02 Найти цитируемый пост)
не могу нигде найти описание для SYSTEM_INFORMATION_CLASS что там и как 

Это обычный перечислимый тип. Выглядит вот так:
Код

SYSTEM_INFORMATION_CLASS = ( 
      SystemBasicInformation, 
      SystemProcessorInformation, 
      SystemPerformanceInformation, 
      SystemTimeOfDayInformation, 
      SystemNotImplemented1, 
      SystemProcessesAndThreadsInformation, 
      SystemCallCounts, 
      SystemConfigurationInformation, 
      SystemProcessorTimes, 
      SystemGlobalFlag, 
      SystemNotImplemented2, 
      SystemModuleInformation, 
      SystemLockInformation, 
      SystemNotImplemented3, 
      SystemNotImplemented4, 
      SystemNotImplemented5, 
      SystemHandleInformation, 
      SystemObjectInformation, 
      SystemPagefileInformation, 
      SystemInstructionEmulationCounts, 
      SystemInvalidInfoClass1, 
      SystemCacheInformation, 
      SystemPoolTagInformation, 
      SystemProcessorStatistics, 
      SystemDpcInformation, 
      SystemNotImplemented6, 
      SystemLoadImage, 
      SystemUnloadImage, 
      SystemTimeAdjustment, 
      SystemNotImplemented7, 
      SystemNotImplemented8, 
      SystemNotImplemented9, 
      SystemCrashDumpInformation, 
      SystemExceptionInformation, 
      SystemCrashDumpStateInformation, 
      SystemKernelDebuggerInformation, 
      SystemContextSwitchInformation, 
      SystemRegistryQuotaInformation, 
      SystemLoadAndCallImage, 
      SystemPrioritySeparation, 
      SystemNotImplemented10, 
      SystemNotImplemented11, 
      SystemInvalidInfoClass2, 
      SystemInvalidInfoClass3, 
      SystemTimeZoneInformation, 
      SystemLookasideInformation, 
      SystemSetTimeSlipEvent, 
      SystemCreateSession, 
      SystemDeleteSession, 
      SystemInvalidInfoClass4, 
      SystemRangeStartInformation, 
      SystemVerifierInformation, 
      SystemAddVerifier, 
      SystemSessionProcessesInformation 
    ); 
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
AVGu
Дата 6.5.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.8.2005

Репутация: 1
Всего: 1



Rouse_
Понял 
Цитата

Это результат очень долгого изучения работы системы под отладчиком

я так и думал smile

еще вопрос если можно  

xxQuerySystemInformation возвращает значения одно из которых STATUS_INFO_LENGTH_MISMATCH. Подскажи пожалуйста какие еще могут быть значения или ссылочку на информацию.  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1804 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.