информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsПортрет посетителяЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Win32] Помогите с вызовом меню из трея виндов. Некрасиво получается, нужен совет. 21.12.02 10:31  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 21.12.02 10:40  Количество правок: 2
<"чистая" ссылка>
Короче такая трабла. Вот примерный код:

Var aData: TNotifyIconData;
begin
  ZeroMemory(@aData, SizeOf(aData));
  aData.cbSize := SizeOf(aData);
  aData.Wnd := Handle;
  aData.uID := 0;
  aData.uCallbackMessage := WM_USER + 100;
  aData.hIcon := Application.Icon.Handle;
  aData.szTip := 'Всем большой приветик!!!';
  aData.uFlags := NIF_ICON Or NIF_MESSAGE Or NIF_TIP;
  IsInTray := Shell_NotifyIcon(NIM_ADD, @aData);
  Win32Check(isInTray);
End;

---

В обработчике WM_USER + 100 :

  Function GetTrayPos: TRect;
  Const
    TrayNotifyWndClass = 'TrayNotifyWnd';
    ShellTrayWndClass = 'Shell_TrayWnd';
  Var
    aWnd: HWND;
  Begin
    aWnd := FindWindow(ShellTrayWndClass, Nil);
    Win32Check(aWnd <> 0);
    aWnd := FindWindowEx(aWnd, 0, TrayNotifyWndClass, Nil);
    Win32Check(aWnd <> 0);
    Win32Check(GetWindowRect(aWnd, Result));
  End;
Var
  aPos: TRect;
  aRes: DWORD;
Begin
  Case M.LParam Of
    WM_LBUTTONDOWN: Windows.Beep(10000, 100);
    WM_RBUTTONDOWN: Begin
      aPos := GetTrayPos;
      aRes := DWORD(TrackPopUpMenu(aMenu, TPM_NONOTIFY Or TPM_RETURNCMD Or TPM_RIGHTBUTTON, aPos.Left, aPos.Top, 0, Handle, Nil));
    End;
  End;
End;

---

Дескриптор pop-up menu гружу из ресурса так:

begin
  aMenu := LoadMenu(HInstance, 'MENU');
  Win32Check(aMenu <> 0);
  aMenu := GetSubMenu(aMenu, 0);
  Win32Check(aMenu <> 0);
end;

---

И всё бы чудесно, меню появляется там где надо и когда надо, но если кликаешь мышой на рабочий стол, то меню не исчезает. Так и болтается на экране, можно работать с другими приложениями, там открывать меню, а это всё болтается. А в виндовых реализациях, к примеру internat.exe меню красиво исчезает, если кликаешь мышой на что-то другое.
И ещё вопрос. Насколько корректно у меня реализовано получения координат трея, в смысле будет ли это работать в следующих версиях виндов? Если кто делал подобное, как это было у вас?
Всем заранее большое спасибо!
SetForegroundWindow & GetCursorPos тебе помогут 21.12.02 22:26  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
В смысле, какое окно я должен посылать в foreground? 22.12.02 20:46  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
которое в TrackPopupMenu 22.12.02 21:58  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
Дык оно у меня invisible ;-) 22.12.02 22:14  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 22.12.02 22:16  Количество правок: 2
<"чистая" ссылка>
без разницы; главное что работает 23.12.02 01:46  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
Спасибо, немного помогло. Кстати, я долго думал, а причём тут GetCursorPos, а когда допёрло, дико ржал — всё гениальное просто... Теперь другая фигня (внутри) 31.12.02 11:20  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Короче, если окно видимое и в фокусе, при вызове меню из трея оно сперва теряет фокус (на трей), потом уходит в фореграунд (вызовом функции), меню кратковременно появляется и исчезает само... А если невидимое окно, то всё нормально. Это как-нибудь лечится, или для всплывающего меню отдельное окно создавать, чтобы всё это было отвязано от видимых окон на экране?
Делай SetForegroundWindow вначале а потом TrackPopupMenu, не наоборот 31.12.02 11:55  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Ну, ребята... Это же и ежу понятно! ;-) Оно так и есть у меня! 31.12.02 12:31  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach