Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Отследить запуск другого приложения  (Прочитано 17671 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 24-08-2009 15:47 » 

Можно ли написать программку, которая бы отслеживала запуск определенного приложения, и с момент этого запуска просто бы засекала время?
Т.е. нужно узнать время, за которое пользователь сидит за некой программой, не меняя кода этой программы.
Можно так?
И куда копать?
« Последнее редактирование: 24-08-2009 15:49 от The Nameless One » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 24-08-2009 16:27 » 

С какой точностью? Если не очень точно, то можно опрашивать список запущеных процессов через определённое время и искать нужный по известным признакам: имя EXE файла, текст окна.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-08-2009 16:55 » 

Думаю, раз в минуту было бы в самый раз.
Текст заголовка окна и имя exe известны.
Как опрашивать список всех запущенных процессов? И получать их имя?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 24-08-2009 17:07 » 

Для твоих задач, тебе вполне хватит FindWindow http://msdn.microsoft.com/en-us/ms633499%28VS.85%29.aspx
Если эта функция вернет хэндл окна, значит приложение запушено.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 24-08-2009 17:09 » 

с каких то пор у меня используются эти функции работы с процессами

тебе отсюда надо GetProcessByExeName_exactly Улыбаюсь

Код:
	//убить процесс
static void KillProcess(const char* const pExeName)
{
DWORD ID;
CString ExeName=pExeName;
if(!GetProcessByExeName(ExeName,&ID))return;

HANDLE hpr=0;
hpr=::OpenProcess(PROCESS_TERMINATE,0,ID);

if(!hpr)
{
CString txt;
CString csSystem32__;
st_GetSystemPATH__(csSystem32__);

//жёстко прибить процесс и все дочерние процессы
txt.Format(" /c %staskkill.exe /pid %d /f /t",csSystem32__,ID);
::st_RunProcessAndWaitWhenDone(csSystem32__+"cmd.exe",txt);

}
else
{
::TerminateProcess(hpr,0);
::CloseHandle(hpr);
}

return;
}


//определение наличия запущенного процесса по имени его модуля (также найдётся ID процесса)
static bool GetProcessByExeName(const char* const pExeName,DWORD* pID=0)
{
CString ExeName=pExeName;

ExeName.MakeUpper();
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32={0};
CString temp="";
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
if(hProcessSnap == (void*)-1)return false;

pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32))temp=pe32.szExeFile;
temp.MakeUpper();
if(temp.Find(ExeName)!=-1)
{
if(pID)*pID=pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
temp=pe32.szExeFile;
temp.MakeUpper();
if(temp.Find(ExeName)!=-1)
{
if(pID)*pID=pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
}
CloseHandle (hProcessSnap);
return false;
}

//определение наличия запущенного процесса по имени его модуля (также найдётся ID процесса)
//(точное совпадение имени)
static bool GetProcessByExeName_exactly(const char* const pExeName,PROCESSENTRY32* pPE=0)
{
bool bRes=false;

CString ExeName=pExeName;
ExeName.MakeUpper();

PROCESSENTRY32 pe32;
memset(&pe32,0,sizeof(pe32));
pe32.dwSize=sizeof(PROCESSENTRY32);

CString temp="";
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS/*TH32CS_SNAPALL*/,NULL);
if(hProcessSnap != (HANDLE)-1)
{
if(Process32First(hProcessSnap,&pe32))
{
for(;;)
{
temp=pe32.szExeFile;
temp.MakeUpper();
if(temp==ExeName)
{
bRes=true;

if(pPE)*pPE=pe32;

break;
}

if(!Process32Next(hProcessSnap,&pe32))break;
}

}

CloseHandle (hProcessSnap);
}


return bRes;
}

Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-08-2009 18:16 » 

Finch и Алексей1153++, большое спасибо:)
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 24-08-2009 20:47 » 

Кхм, рано я порадовался.
С кодом Алексей1153++ я не разобрался - слишком много для меня новых слов, я то в С++ вообще нуб ещё, а с WinApi вообще только-только начинаю знакомиться. Улыбаюсь

Про новые слова - это я про PROCESSENTRY32, СString - на них компилятор ругается, что это неопределённые идентификаторы.
windows.h и cstring подключил.

Про то, что оператор разрешения области видимости  :: ставиться перед некоторыми функциями - впервые, к своему нубству, встречаю. И не понимаю, естественно, для чего.
То же про "статик функции" (static перед возвращаемым значением).

Попробую решить задачу, по ссылке Finchа в msdn, т.е. с помощью ф-ии FindWindow(NULL, "Caption_target_window"); Если я вызову эту функцию, в таком виде, где "Caption_target_window" - заголовок окна программы, которую нужно отследить, то функция будет искать в запущенных процессах программу, чьё окно содержит такой заголовок, и если находит - то возвращает декскриптор этого окна hwnd, иначе 0.
Правильно ли я понял? Улыбаюсь

И как лучше организовать опрос? Как цикл, в котором каждую минуту вызывается FindWindow()?
« Последнее редактирование: 24-08-2009 20:49 от The Nameless One » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 24-08-2009 20:53 » 

Ну есть замечательная функция sleep которая усыпляет текушую нить программы на заданное время.
Если ты не используеш MFC, то :: перед функцией не нужны. Так как многие функции API в MFC переопределены, то чтоб использовать изначальные функции, приходится применять такой трюк. Лешкин пример построен c учетом применения MFC.
« Последнее редактирование: 24-08-2009 20:56 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 24-08-2009 21:01 » 

Про Sleep() знаю Улыбаюсь Значит, можно циклом.

Ну рам MFC, тогда понятно - его я совсем не знаю. Все эти PROCESSENTRY32 и СString - из него?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 24-08-2009 21:07 » 

PROCESSENTRY32 нет. Это из другой оперы. Это структура, в которую записываются данные по процессам. А вот CString это MFC. Аналог std::string.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 24-08-2009 21:19 » 

В MSDN посмотрел, что для использования PROCESSENTRY32 нужно подключить Tlhelp32.h. Поэтому, очевидно, у меня компилятор ругался, что PROCESSENTRY32 - неопределёный идентификатор.
Спасибо за ответы!

Кстати, не хочется отдельную тему для этого создавать, но интересно узнать. Много ли С++-программистов знают и иногда используют (успешно Улыбаюсь ) C#?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 25-08-2009 03:27 » new

добровольно на C# никогда не перейду ) Пока использовал только для зарабатывания денег - задачки студентам решал. После c++ чувствуешь себя там сковано
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines