aquanet sk |
Отправлено: 22.01.2007, 23:36 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
Здравствуйте всем!
Хочу повысить выживаемость пиктограммы в трее в тот момент, когда Explorer выдает ошибку и перезагружается. Известно , что при такой ситуации многие пиктограммы программ пропадают из системного трея, при это сами программы продолжают работать.
События других программ можно было бы отловить системными командами ( на форуме видел подобные темы), но как подловить момент когда эксплорер закрывается в следствии возникновения ошибки, ну или либо определить, что он перезагрузился, чтобы затем программно удалить пиктограмму своего приложения и снова загрузить.
Вопрос: Как отловить событие ребута эксплорера? |
|
Tantos |
Отправлено: 23.01.2007, 02:32 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
ИМХО, проверять наличие процесса explorer.exe. Можно для надежности написать сервис под это дело.
|
|
Gedeon |
Отправлено: 24.01.2007, 11:20 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
А там случаем никакого сообщения окошкам не посылается при этом? или при перерисовке области уведомлений?
|
|
aquanet sk |
Отправлено: 24.01.2007, 12:58 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
QUOTE (Tantos @ 23.01.2007, 02:32) | ..проверять наличие процесса explorer.exe.. |
Ну это по событию таймера тогда надо, лишний нагруз на прогу, лучше бы отловить событие. (да и потом зная событие, я смогу его обработать, а написать целый сервис вряд ли ) |
|
Tantos |
Отправлено: 24.01.2007, 16:10 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Таймер лишь один из вариантов решения. Что мешает использовать WaitForSingleObject, к примеру?
|
|
aquanet sk |
Отправлено: 25.01.2007, 00:13 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
QUOTE (Tantos @ 24.01.2007, 16:10) | Таймер лишь один из вариантов решения. Что мешает использовать WaitForSingleObject, к примеру? |
Вот кстати да, в поисках решения нашел эту функцию в Архангельском, но она там используется для синхронизации процессов, предпринял несколько попыток заточить её под данную тему, не получилось, даже выкладывать свои лажовые попытки не буду, дабы не засорять =) Пожалуйста, если Вы уж точно представляете как можно использовать эту функцию, чтобы решить проблему данной темы, давайте сделаем полезный пост и закроем тему, дабы она не осталась пустой и нерешенной. |
|
Gedeon |
Отправлено: 25.01.2007, 13:45 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну типа вот вам консольное приложение:
CODE |
//---------------------------------------------------------------------------
#pragma hdrstop
#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int ExplorerPID;
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnap, &pe32))
{
CloseHandle(hProcessSnap);
}
bool ExplExists = false;
do
{
if(!strcmpi("calc.exe",pe32.szExeFile))
{
ExplorerPID = pe32.th32ProcessID;
ExplExists = true;
break;
}
}
while(Process32Next(hProcessSnap, &pe32));
CloseHandle(hProcessSnap);
if(ExplExists)
{
HANDLE hProcess = OpenProcess(SYNCHRONIZE,false,ExplorerPID);
WaitForSingleObject(hProcess,INFINITE);
CloseHandle(hProcess);
printf("Stopped\n");
}
else
printf("Not Running\n");
system("PAUSE");
return 0;
}
//--------------------------------------------------------------------------- |
правда на примере калькулятора
|
|
Tantos |
Отправлено: 25.01.2007, 16:19 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
2 Gedeon: Опередил . Хотел на выходных что-нибудь наваять...
P.S. Извиняюсь за оффтоп.
|
|
aquanet sk |
Отправлено: 26.01.2007, 00:49 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
Мдаа, пример не для новичка, можно пояснить как Вы ID Explorer`a получили?
А про функцию WaitForSingleObject вычитал, что во время её выполнения приложение не обрабтывает никаких событий, а в мою прогу в любой момент может поступить сообщение из сети.
Отредактировано aquanet sk — 26.01.2007, 00:51 |
|
Gedeon |
Отправлено: 26.01.2007, 09:09 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (aquanet sk @ 26.01.2007, 00:49) | Мдаа, пример не для новичка, можно пояснить как Вы ID Explorer`a получили?
А про функцию WaitForSingleObject вычитал, что во время её выполнения приложение не обрабтывает никаких событий, а в мою прогу в любой момент может поступить сообщение из сети. |
Про PID ну там же все на С++ написано
Про WaitForSingleObject в поток ее отдельный.
|
|
aquanet sk |
Отправлено: 27.01.2007, 00:52 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
Ладно, короче это не моего уровня, я не умею оперировать такими понятиями, как потоки или процессы, максимум что смог — синхронизировать работу прог по примеру Архангельского.
Короче придется поломать голову над другим способом =) |
|
aquanet sk |
Отправлено: 27.01.2007, 21:34 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 87
|
придумал, короче как правило мы замечаем, что значек пропал из трея, когда он (этот значок) нам становится нужен, поэтому можно его (значок) перезагружать вручную каждый раз, когда это надо. Я сделал выгрузку и загрузку пиктограммы (значка) по горячим клавишам Ctrl+I.
Отредактировано aquanet sk — 03.02.2007, 01:22 |
|