информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Дык оно у меня invisible ;-) 22.12.02 22:14  Число просмотров: 1958
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 22.12.02 22:16  Количество правок: 2
<"чистая" ссылка>
<programming>
[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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach