Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | |
без разницы; главное что работает 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
|
|
|
|