Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Как обновить SysTray (убить значки от убитых программ)
На страницу 1, 2  След.

Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
NightCat
Гость







СообщениеПт, 14-Июл-2006 20:04    Заголовок сообщения: Как обновить SysTray (убить значки от убитых программ)
Цитата

Здравствуйте!
Я использую вот этот код:
delphi:
  1.  
  2. function KillTask(ExeFileName: string): integer;
  3. const
  4.   PROCESS_TERMINATE=$0001;
  5. var
  6.   ContinueLoop: BOOL;
  7.   FSnapshotHandle: THandle;
  8.   FProcessEntry32: TProcessEntry32;
  9. begin
  10.   result := 0;
  11.  
  12.   FSnapshotHandle := CreateToolhelp32Snapshot
  13.                      (TH32CS_SNAPPROCESS, 0);
  14.   FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  15.   ContinueLoop := Process32First(FSnapshotHandle,
  16.                                  FProcessEntry32);
  17.  
  18.   while integer(ContinueLoop) <> 0 do
  19.   begin
  20.     if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
  21.          UpperCase(ExeFileName))
  22.      or (UpperCase(FProcessEntry32.szExeFile) =
  23.          UpperCase(ExeFileName))) then
  24.       Result := Integer(TerminateProcess(OpenProcess(
  25.                         PROCESS_TERMINATE, BOOL(0),
  26.                         FProcessEntry32.th32ProcessID), 0));
  27.     ContinueLoop := Process32Next(FSnapshotHandle,
  28.                                   FProcessEntry32);
  29.   end;
  30.  
  31.   CloseHandle(FSnapshotHandle);
  32. end;
  33.  

чтобы убить программу. Затем запускаю ее снова, короче вот так:
delphi:
  1.  
  2.   KillTask('programma.exe');
  3.   ShellExecute(0,'open',PChar(ufn),nil,PChar(ExtractFilePath(ufn)),SW_SHOWNORMAL);
  4.  

ufn - путь с именем к "'programma.exe" :)
Проблема в том, что данная программа, при жизни своей (конкретно при запусе) создает и помещает в Tray иконку.
А при выполнении ее убийства и новом запуске остаются иконки от старых копий.
Они исчезают, если мышкой над ними провести.
Так вот, можно ли как-то обновить что-ли Tray программно, чтобы иконка от убитой программы исчезла сама после убийства?
Спасибо!
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСб, 15-Июл-2006 20:42 
Цитата

вызвать update или refresh трея, для простоты можно обновить всё - параметр = nil.
_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
NightCat
Гость







СообщениеПн, 17-Июл-2006 21:59 
Цитата

А к чему обращаться-то? (update или refresh трея) :)
Т.е. это метод какого-то класса или это функции есть такие системные?
В начало
Пол:Муж dogma
aka Достоевский


Возраст: 27
Знак зодиака: Телец
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
СообщениеВт, 18-Июл-2006 2:50 
Цитата

Нужно просто при закрытии программы очищать дескрипторы. Короче говоря не оставлять после себя мусора.
_________________
Bonum initium est dimidium facti
SQL-задачи (on-line)
В начало
Посмотреть профиль Отправить личное сообщение
NightCat
Гость







СообщениеВт, 18-Июл-2006 8:38 
Цитата

Так закрываю-то я не свою программу! а из своей программы чужую! и потом ее запускаю снова. Поэтому в нее (в чужую) изменений никаких внести не могу. Закрываю я, если интересно UserGate версии 2.8
А еще он (UserGate), если его закрывать не жестко (KillTask();), а простой посылкой сообщения на закрытие, выдает окошко с вопросом, мол точно ли я хочу его закрыть, а этого мне тоже не надо...
Мне надо его "бесшумно" закрыть и снова запустить и чтоб "грязи" не оставалось.
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеВт, 18-Июл-2006 18:00 
Цитата

UpdateWindow(hwnd_Трея);
ещё, КАЖЕТСЯ, будет работать с nil или 0. тогда будут перерисованы все окна.

_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
NightCat
Гость







СообщениеВт, 18-Июл-2006 18:50 
Цитата

Не помогает...
Делал так:
delphi:
  1.  
  2.   TrayWnd := FindWindow('Shell_TrayWnd', nil);
  3.   TrayWnd := FindWindowEx(TrayWnd, 0, 'TrayNotifyWnd', nil);
  4.   TrayWnd := FindWindowEx(TrayWnd, 0, 'SysPager', nil);
  5.   TrayWnd := FindWindowEx(TrayWnd, 0, 'ToolbarWindow32', nil);
  6.   if IsWindow(TrayWnd) then
  7.   begin
  8.     UpdateWindow(TrayWnd);
  9.   end;
  10.  

С нулем вместо TrayWnd тоже пробовал. Остается иконка...
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеВт, 18-Июл-2006 19:06 
Цитата

хватит двух первых строчек
насчёт нуля, попробуй HWND_DESKTOP
и вообще, чё напрягаться? рефреш родительского окна вызывает рефреш детей

_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
NightCat
Гость







СообщениеВт, 18-Июл-2006 23:13 
Цитата

Так я и пишу, что я попробовал и родительские окна (для трея) и 0 = десктоп весь - не помогает...
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеСр, 19-Июл-2006 5:10 
Цитата

to NikotiN
нет, правда, это не помогает.
мне стало интересно и я решил сам попробовать.
пробовал и UpdateWindow, и слал всякие сообщения в трей, и изменял параметры системы через SystemParametersInfo, и
даже иконку пробовал создавать и удалять в трее через Shell_NotifyIcon - на "убитую" иконку ничего не действует, разве что курсором провести над ней. ;)

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 19-Июл-2006 9:15 
Цитата

Да, насколько я понял, трей удаляет иконку только после того, как попытается послать ей сообщение, и получит отлуп
_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 19-Июл-2006 18:02 
Цитата

счас я попытаюсь найти ответ, как я избавился от этого, только вот не помню где ))...

Добавлено спустя 29 минут 7 секунд:

Shell_NotifyIcon?

Добавлено спустя 11 минут 22 секунды:

гм, ничего нет )) видимо снёс, тогда сегодня дельфи поставлю, и может даже сегодня отвечу.

_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
NightCat
Гость







СообщениеСр, 19-Июл-2006 19:41 
Цитата

Будем ждать-с :) Я так-то поэксперементировать и сам не прочь - потому и обратился, что попробовал много вариантов - ничего не помогло...
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 19-Июл-2006 20:32 
Цитата

а Shell_NotifyIcon не помог? вроде в msdn написано как раз для таких случаев
_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 19-Июл-2006 22:58 
Цитата

to NikotiN
Цитата:
Shell_NotifyIcon не помог? вроде в msdn написано как раз для таких случаев

Нет, он для других случаев :)

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 2 На страницу 1, 2  След.
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100