Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Обновить systemtray


Автор: ASGDeveloper 26.1.2007, 12:08
Можно ли обновить трей? То есть заставить проводник перерисовать иконки в трее (например чтобы убрать иконки уже убитых приложений).


M
Girder
http://forum.vingrad.ru/index.php?showtopi...st&p=523837

Автор: _hunter 26.1.2007, 12:12
на Codeproject' е был исходник. основная идея -- проэмулировать движение мышой по области трея...

Автор: Romikgy 26.1.2007, 12:19
А если окну класса TrayNotifyWnd послать команду репаинт?

Автор: Yanis 26.1.2007, 12:23
Способ номер 1:
Код
var
  wnd : cardinal;
  rec : TRect;
  w,h : integer;
  x,y : integer;
begin
  // find a handle of a tray
  wnd := FindWindow('Shell_TrayWnd', nil);
  wnd := FindWindowEx(wnd, 0, 'TrayNotifyWnd', nil);
  wnd := FindWindowEx(wnd, 0, 'SysPager', nil);
  wnd := FindWindowEx(wnd, 0, 'ToolbarWindow32', nil);
  // get client rectangle (needed for width and height of tray)
  windows.GetClientRect(wnd, rec);
  // get size of small icons
  w := GetSystemMetrics(sm_cxsmicon);
  h := GetSystemMetrics(sm_cysmicon);
  // initial y position of mouse - half of height of icon
  y := w shr 1;
  while y < rec.Bottom do begin // while y < height of tray
    x := h shr 1; // initial x position of mouse - half of width of icon
    while x < rec.Right do begin // while x < width of tray
      SendMessage(wnd, wm_mousemove, 0, y shl 16 or x); // simulate moving mouse over an icon
      x := x + w; // add width of icon to x position
    end;
    y := y + h; // add height of icon to y position
  end;
end;


Способ номер 2:
Код
procedure RemoveDeadIcons;
var
  TrayWindow : HWnd;
  WindowRect : TRect;
  SmallIconWidth : Integer;
  SmallIconHeight : Integer;
  CursorPos : TPoint;
  Row : Integer;
  Col : Integer;
begin
  { Get tray window handle and bounding rectangle }
  TrayWindow := FindWindowEx(FindWindow('Shell_TrayWnd',NIL),0,'TrayNotifyWnd',NIL);
  if not GetWindowRect(TrayWindow,WindowRect) then Exit;
  { Get small icon metrics }
  SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
  SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
  { Save current mouse position }
  GetCursorPos(CursorPos);
  { Sweep the mouse cursor over each icon in the tray in both dimensions }
  with WindowRect do
    for Row := 0 to (Bottom - Top) DIV SmallIconHeight do
      for Col := 0 to (Right - Left) DIV SmallIconWidth do
        begin
        SetCursorPos(Left + Col * SmallIconWidth, Top + Row * SmallIconHeight);
        Sleep(0);
        end;
  { Restore mouse position }
  SetCursorPos(CursorPos.X,CursorPos.Y);
  { Redraw tray window (to fix bug in multi-line tray area) }
  RedrawWindow(TrayWindow,NIL,0,RDW_INVALIDATE OR RDW_ERASE OR RDW_UPDATENOW);
end;


Найдено на просторах инета.

Автор: Romikgy 26.1.2007, 12:45
Цитата(Yanis @  26.1.2007,  11:23 Найти цитируемый пост)
if not GetWindowRect(TrayWindow,WindowRect) then Exit;
  { Get small icon metrics }
  SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
  SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
  { Save current mouse position }
  GetCursorPos(CursorPos);
  { Sweep the mouse cursor over each icon in the tray in both dimensions }
  with WindowRect do
    for Row := 0 to (Bottom - Top) DIV SmallIconHeight do
      for Col := 0 to (Right - Left) DIV SmallIconWidth do
        begin
        SetCursorPos(Left + Col * SmallIconWidth, Top + Row * SmallIconHeight);
        Sleep(0);
        end;
  { Restore mouse position }
  SetCursorPos(CursorPos.X,CursorPos.Y);

зачем это все ?

Автор: Yanis 26.1.2007, 12:50
Цитата(Romikgy @  26.1.2007,  13:45 Найти цитируемый пост)
зачем это все ? 

Какой филосовский вопрос smile Что бы установить курсор над каждой иконкой ToolbarWindow32 системного трея.

Автор: Romikgy 26.1.2007, 12:53
Цитата(Yanis @  26.1.2007,  11:50 Найти цитируемый пост)
Что бы установить курсор над каждой иконкой ToolbarWindow32 системного трея. 

зачем ? при 

Цитата(Yanis @  26.1.2007,  11:23 Найти цитируемый пост)
RedrawWindow(TrayWindow,NIL,0,RDW_INVALIDATE OR RDW_ERASE OR RDW_UPDATENOW);

 smile 

Автор: Yanis 26.1.2007, 12:56
Цитата(Romikgy @  26.1.2007,  13:53 Найти цитируемый пост)
RedrawWindow(TrayWindow,NIL,0,RDW_INVALIDATE OR RDW_ERASE OR RDW_UPDATENOW);

Эта функция не помогает решить проблему сабжа, но нужна для
Цитата(Yanis @  26.1.2007,  13:23 Найти цитируемый пост)
Redraw tray window (to fix bug in multi-line tray area)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)