C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Обход глюка Explorer`а, устойчивость значка в трее ошибке Explor
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..

Ну это по событию таймера тогда надо, лишний нагруз на прогу, лучше бы отловить событие. (да и потом зная событие, я смогу его обработать, а написать целый сервис вряд ли cool.gif )
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;
}
//---------------------------------------------------------------------------

правда на примере калькулятора biggrin.gif
Tantos
Отправлено: 25.01.2007, 16:19


Станционный диспетчер

Группа: Участник
Сообщений: 108



2 Gedeon: Опередил wink.gif . Хотел на выходных что-нибудь наваять...

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 ну там же все на С++ написано smile.gif

Про 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

Вернуться в Вопросы программирования в C++Builder