Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновить tray [D5, Win2k]


Shur_ap ©   (2002-07-23 21:52:00) 

Может кто подскажет как обновить tray, а то приложения закрываются, а иконы продолжают висеть в трее. Или обновлением тут не поможешь?


Eugene Lachinov   (2002-07-26 16:05:00) [1]

Думаю нет, хотя несохраненные данные бывают разные


Shur_ap   (2002-07-26 15:48:00) [2]

А есть что-нить катастрофическое в убийстве процесса не считая потери несохраненных данных?


Eugene Lachinov   (2002-07-26 15:44:00) [3]

1 - процесс закрыт нормально по WM_CLOSE, а 2 был убит по TerminateProcess

TA_FAILED = 0;
TA_SUCCESS_CLEAN = 1;
TA_SUCCESS_KILL = 2;
TA_SUCCESS_16 = 3;


Shur_ap   (2002-07-26 15:41:00) [4]

При закрытии Agnitum Outpost FireWall иконка из трея пропадает


Shur_ap   (2002-07-26 15:39:00) [5]

Все работает. Только что показавает Result. При закрытии блокнота и т.п. Result = 1, а при закрытии Agnitum Outpost FireWall Result = 2. Это о чем-нибудь говорит?


Shur_ap   (2002-07-24 17:54:00) [6]

>Eugene Lachinov
Спасибо, пойду пробовать


Eugene Lachinov   (2002-07-24 17:54:00) [7]

Обновление Tray мышкой, если все-таки TA_SUCCESS_KILL

function FindTrayWnd : HWnd;
var
szClassName : array[0..255] of Char;
begin
Result := FindWindow("Shell_TrayWnd", "");
if Result <> 0 then begin
Result := GetWindow(Result, GW_CHILD);
while Result <> 0 do begin
GetClassName(Result, szClassName, 255);
if StrIComp(szClassName, "TrayNotifyWnd") = 0 then
Exit
else
Result := GetWindow(Result, GW_HWNDNEXT)
end
end
end;

procedure RefreshTrayWnd;
var
i, j : Integer;
Rect : TRect;
SavePos : TPoint;
TrayWnd : HWnd;
begin
TrayWnd := FindTrayWnd;
if TrayWnd <> 0 then begin
GetCursorPos(SavePos);
ShowCursor(False);
GetWindowRect(TrayWnd, Rect);
i := Rect.Left + 5;
while i < Rect.Right do begin
j := Rect.Top + 5;
while j < Rect.Bottom do begin
SetCursorPos(i, j); Sleep(0);
Inc(j, 15)
end;
Inc(i, 15)
end;
SetCursorPos(SavePos.X, SavePos.Y);
ShowCursor(True)
end
end;


Eugene Lachinov   (2002-07-24 17:51:00) [8]

Попробуй так
const
TA_FAILED = 0;
TA_SUCCESS_CLEAN = 1;
TA_SUCCESS_KILL = 2;
TA_SUCCESS_16 = 3;

function TerminateProgramEnum(Window : HWND; lParam : LPARAM) : Bool; stdcall;
var
dwID : DWORD;
begin
GetWindowThreadProcessId(Window, @dwID);
if dwID = DWORD(lParam) then
PostMessage(Window, WM_CLOSE, 0, 0);
Result := True;
end;

function TerminateProgram(dwPID : DWORD; dwTimeout : DWORD) : DWORD;
var
hProc : THandle;
begin
hProc := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, FALSE, dwPID);
if (hProc <> 0) then try
EnumWindows(@TerminateProgramEnum, dwPID);
if WaitForSingleObject(hProc, dwTimeout) <> WAIT_OBJECT_0 then begin
if TerminateProcess(hProc, 0) then
Result := TA_SUCCESS_KILL
else
Result := TA_FAILED
end else
Result := TA_SUCCESS_CLEAN
finally
CloseHandle(hProc)
end else
Result := TA_FAILED
end;


Shur_ap   (2002-07-24 17:47:00) [9]

>Eugene Lachinov
Да, я запускаю и закрываю своей программой другие приложения


Eugene Lachinov   (2002-07-24 17:44:00) [10]

>Shur_ap
Приложение создает иконку в Tray или это аналог Task Manager ?


Shur_ap   (2002-07-24 17:38:00) [11]

>Eugene Lachinov
А как тогда нормально завершить?


Eugene Lachinov   (2002-07-24 17:35:00) [12]

>Shur_ap
Я думаю нет, это все равно что из Task Manager "End Process"


Shur_ap   (2002-07-24 17:31:00) [13]

>Eugene Lachinov
А если я закрываю приложение через TerminateProcess(), то это нормальное завершение или нет?


Proton   (2002-07-24 16:28:00) [14]

попробуй перед закрытием проги (termanateprocess) слать ей Wm_quiT
мо поводу обновления - то можно
найди окно findwindow+findwindowex
шли туда wm_mousemove

пример уже был на форуме - поищи


Eugene Lachinov   (2002-07-24 16:16:00) [15]

Тут, наверно, речь шла о ненормальном завершении программ или я ошибся ?


Эмиль   (2002-07-24 16:06:00) [16]

посмотри в хелпе NIM_DELETE


DiamondShark   (2002-07-24 13:20:00) [17]

Висеть они там продолжают если программа завершается некорректно или аварийно.

Перед выходом из программы удалять надо все что насовал в трей.
Принцип, знаете ли, есть такой: поел -- убери за собой.


Eugene Lachinov   (2002-07-23 22:42:00) [18]

Провести программно мышкой по нему.


Наверх

Титульная страница Поиск, карта сайта Написать письмо