| Автор
| Сообщение |
|
|
|
Цитата |
|
Здравствуйте!
Я использую вот этот код:
| delphi: | function KillTask(ExeFileName: string): integer; const PROCESS_TERMINATE=$0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := 0; FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;
|
чтобы убить программу. Затем запускаю ее снова, короче вот так:
| delphi: | KillTask('programma.exe'); ShellExecute(0,'open',PChar(ufn),nil,PChar(ExtractFilePath(ufn)),SW_SHOWNORMAL);
|
ufn - путь с именем к "'programma.exe"
Проблема в том, что данная программа, при жизни своей (конкретно при запусе) создает и помещает в Tray иконку.
А при выполнении ее убийства и новом запуске остаются иконки от старых копий.
Они исчезают, если мышкой над ними провести.
Так вот, можно ли как-то обновить что-ли Tray программно, чтобы иконка от убитой программы исчезла сама после убийства?
Спасибо! |
|
| В начало |
|
 |
|
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
вызвать update или refresh трея, для простоты можно обновить всё - параметр = nil. _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
А к чему обращаться-то? (update или refresh трея)
Т.е. это метод какого-то класса или это функции есть такие системные? |
|
| В начало |
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
Нужно просто при закрытии программы очищать дескрипторы. Короче говоря не оставлять после себя мусора. _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Так закрываю-то я не свою программу! а из своей программы чужую! и потом ее запускаю снова. Поэтому в нее (в чужую) изменений никаких внести не могу. Закрываю я, если интересно UserGate версии 2.8
А еще он (UserGate), если его закрывать не жестко (KillTask();), а простой посылкой сообщения на закрытие, выдает окошко с вопросом, мол точно ли я хочу его закрыть, а этого мне тоже не надо...
Мне надо его "бесшумно" закрыть и снова запустить и чтоб "грязи" не оставалось. |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
UpdateWindow(hwnd_Трея);
ещё, КАЖЕТСЯ, будет работать с nil или 0. тогда будут перерисованы все окна. _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Не помогает...
Делал так:
| delphi: | TrayWnd := FindWindow('Shell_TrayWnd', nil); TrayWnd := FindWindowEx(TrayWnd, 0, 'TrayNotifyWnd', nil); TrayWnd := FindWindowEx(TrayWnd, 0, 'SysPager', nil); TrayWnd := FindWindowEx(TrayWnd, 0, 'ToolbarWindow32', nil); if IsWindow(TrayWnd) then begin UpdateWindow(TrayWnd); end;
|
С нулем вместо TrayWnd тоже пробовал. Остается иконка... |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
хватит двух первых строчек
насчёт нуля, попробуй HWND_DESKTOP
и вообще, чё напрягаться? рефреш родительского окна вызывает рефреш детей _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Так я и пишу, что я попробовал и родительские окна (для трея) и 0 = десктоп весь - не помогает... |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to NikotiN
нет, правда, это не помогает.
мне стало интересно и я решил сам попробовать.
пробовал и UpdateWindow, и слал всякие сообщения в трей, и изменял параметры системы через SystemParametersInfo, и
даже иконку пробовал создавать и удалять в трее через Shell_NotifyIcon - на "убитую" иконку ничего не действует, разве что курсором провести над ней.  _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Да, насколько я понял, трей удаляет иконку только после того, как попытается послать ей сообщение, и получит отлуп _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
счас я попытаюсь найти ответ, как я избавился от этого, только вот не помню где ))...
Добавлено спустя 29 минут 7 секунд:
Shell_NotifyIcon?
Добавлено спустя 11 минут 22 секунды:
гм, ничего нет )) видимо снёс, тогда сегодня дельфи поставлю, и может даже сегодня отвечу. _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Будем ждать-с Я так-то поэксперементировать и сам не прочь - потому и обратился, что попробовал много вариантов - ничего не помогло... |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

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

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
to NikotiN
| Цитата: | | Shell_NotifyIcon не помог? вроде в msdn написано как раз для таких случаев |
Нет, он для других случаев  _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|