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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
без разницы; главное что работает 23.12.02 01:46  Число просмотров: 1982
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
<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