Форум: "WinAPI";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизСообщения PopupMenu Найти похожие ветки
← →
i-s-v (2004-03-31 00:22) [0]Подскажите, плз, какое сообщение отправляет попап-меню окну при исчезновении???
← →
unya (2004-03-31 00:41) [1]А нафига?
← →
Игорь Шевченко © (2004-03-31 00:51) [2]При выборе команды - WM_COMMAND, просто при закрытии (мышкой вне меню кликнули) - никакого
← →
nikkie © (2004-03-31 01:38) [3]а как же WM_EXITMENULOOP?
WM_COMMAND, кстати, может и не посылаться (TPM_NONOTIFY)
← →
Игорь Шевченко © (2004-03-31 10:27) [4]nikkie © (31.03.04 01:38)
Как ни странно, я перед тем, как ответить (первая мысль тоже была про WM_EXITMENULOOP) написал мелкое приложение (форму с PopupMenu) и пропустил ее через Spy++, WM_EXITMENULOOP в списке сообщений не оказалось :(
Может, я чего не так делал ?
Правда, само сообщение на форме я не ловил. Попробуешь ?
← →
nikkie © (2004-03-31 23:43) [5]форма с PopupMenu - полностью VCL, я так понял? насколько мне помнится, TPopupMenu создает невидимое окно. наверное ты не на то окно смотрел.
я попробовал на программе использующей TrackPopupMenu, в которой я 100% знаю какой передается hwnd - вижу сообщения WM_ENTERMENULOOP, WM_EXITMENULOOP. отображаются они, правда, странненько (см. лог ниже). точки такие я первый раз увидел, что они обозначают не знаю. такое ощущение, что пытаются передать какой-то уровень вложенности. почему они сдвигаются - совсем непонятно. действия мои были такие:
1) открыл popup menu
2) закрыл popup menu, кликнув мимо
3) открыл popup menu
4) закрыл popup menu, кликнув кликнув по menu item
5) открыл main menu
6) закрыл main menu, кликнув мимо
7) открыл main menu
8) закрыл main menu, кликнув кликнув по menu item<00001> 000905B0 S ........................................................................................................................ .......WM_ENTERMENULOOP fIsTrackPopupMenu:True
<00002> 000905B0 R ........................................................................................................................ .......WM_ENTERMENULOOP
<00003> 000905B0 S ........................................................................................................................ .............................WM_EXITMENULOOP fIsTrackPopupMenu:True
<00004> 000905B0 R ........................................................................................................................ .............................WM_EXITMENULOOP
<00005> 000905B0 S ........................................................................................................................ ..................................WM_ENTERMENULOOP fIsTrackPopupMenu:True
<00006> 000905B0 R ........................................................................................................................ ..................................WM_ENTERMENULOOP
<00007> 000905B0 S ........................................................................................................................ ............................................................................WM_EXITMENULOOP fIsTrackPopupMenu:True
<00008> 000905B0 R ........................................................................................................................ ............................................................................WM_EXITMENULOOP
<00009> 000905B0 P WM_COMMAND wNotifyCode:0 (sent from a menu) wID:40010
<00010> 000905B0 S ........................................................................................................................ ...........................................................................WM_ENTERMENULOOP fIsTrackPopupMenu:False
<00011> 000905B0 R ........................................................................................................................ ...........................................................................WM_ENTERMENULOOP
<00012> 000905B0 S ........................................................................................................................ ........................................................................................................................ ..........................................................................WM_EXITMENULOOP fIsTrackPopupMenu:False
<00013> 000905B0 R ........................................................................................................................ ........................................................................................................................ ..........................................................................WM_EXITMENULOOP
<00014> 000905B0 S ........................................................................................................................ ........................................................................................................................ ..........................................................................WM_ENTERMENULOOP fIsTrackPopupMenu:False
<00015> 000905B0 R ........................................................................................................................ ........................................................................................................................ ..........................................................................WM_ENTERMENULOOP
<00016> 000905B0 S ........................................................................................................................ ........................................................................................................................ ........................................................................................................................ ....WM_EXITMENULOOP fIsTrackPopupMenu:False
<00017> 000905B0 R ........................................................................................................................ ........................................................................................................................ ........................................................................................................................ ....WM_EXITMENULOOP
<00018> 000905B0 P WM_COMMAND wNotifyCode:0 (sent from a menu) wID:40005
← →
Игорь Шевченко © (2004-04-01 01:29) [6]nikkie © (31.03.04 23:43)
Точно, спасибо за напоминание про невидимое окно. Действительно, этому окну посылается WM_EXITMENULOOP, пришлось небольшую программку написать.unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus;
type
TfMain = class(TForm)
PopupMenu1: TPopupMenu;
Item11: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
procedure Exit1Click(Sender: TObject);
end;
var
fMain: TfMain;
implementation
uses
HSHookUtils; { Для определения имени сообщения по его коду }
{$R *.dfm}
type
THSPopupList = class(TPopupList)
protected
procedure WndProc(var Message: TMessage); override;
end;
procedure TfMain.Exit1Click(Sender: TObject);
begin
Close;
end;
{ Utility }
var
F: TextFile;
procedure LogMessage(const Message: TMessage);
var
FileName: string;
begin
FileName := ChangeFileExt(Application.ExeName, ".log");
AssignFile(F, FileName);
if FileExists(FileName) then
Append(F)
else
Rewrite(F);
writeln(F, Format("%s (%.8x, %.8x)", [MsgName(Message.Msg),
Message.WParam, Message.lParam]));
CloseFile(F);
end;
{ THSPopupList }
procedure THSPopupList.WndProc(var Message: TMessage);
begin
LogMessage(Message);
inherited;
end;
initialization
PopupList.Free; { Уничтожим системный экземпляр класса }
PopupList := THSPopupList.Create; { И создадим свой PopupList, протоколирующий сообщения }
end.
И вот что в протоколе оказалось:WM_ACTIVATEAPP (00000001, 00000260)
WM_ENTERMENULOOP (00000001, 00000000)
WM_SETCURSOR (00040188, 00000002)
WM_INITMENU (01CD01AB, 00000000)
WM_INITMENUPOPUP (01CD01AB, 00000000)
WM_ENTERIDLE (00000002, 00050194)
...
WM_ENTERIDLE (00000002, 00050194)
WM_MENUSELECT (80800001, 01CD01AB)
WM_ENTERIDLE (00000002, 00050194)
...
WM_ENTERIDLE (00000002, 00050194)
WM_CAPTURECHANGED (00000000, 00000000)
WM_UNINITMENUPOPUP (01CD01AB, 00000000)
WM_MENUSELECT (FFFF0000, 00000000)
WM_EXITMENULOOP (00000001, 00000000)
WM_COMMAND (00000001, 00000000)
WM_ENTERMENULOOP (00000001, 00000000)
WM_SETCURSOR (00040188, 00000002)
WM_INITMENU (01CD01AB, 00000000)
WM_INITMENUPOPUP (01CD01AB, 00000000)
WM_ENTERIDLE (00000002, 00060194)
...
WM_ENTERIDLE (00000002, 00060194)
WM_CAPTURECHANGED (00000000, 00000000)
WM_UNINITMENUPOPUP (01CD01AB, 00000000)
WM_MENUSELECT (FFFF0000, 00000000)
WM_EXITMENULOOP (00000001, 00000000)
WM_ENTERMENULOOP (00000001, 00000000)
WM_SETCURSOR (00040188, 00000002)
WM_INITMENU (01CD01AB, 00000000)
WM_INITMENUPOPUP (01CD01AB, 00000000)
WM_ENTERIDLE (00000002, 00070194)
...
WM_ENTERIDLE (00000002, 00070194)
WM_MENUSELECT (80800001, 01CD01AB)
WM_ENTERIDLE (00000002, 00070194)
...
WM_ENTERIDLE (00000002, 00070194)
WM_MENUSELECT (88030002, 01CD01AB)
WM_ENTERIDLE (00000002, 00070194)
...
WM_ENTERIDLE (00000002, 00070194)
WM_MENUSELECT (80800003, 01CD01AB)
WM_ENTERIDLE (00000002, 00070194)
...
WM_ENTERIDLE (00000002, 00070194)
WM_CAPTURECHANGED (00000000, 00000000)
WM_UNINITMENUPOPUP (01CD01AB, 00000000)
WM_MENUSELECT (FFFF0000, 00000000)
WM_EXITMENULOOP (00000001, 00000000)
WM_COMMAND (00000003, 00000000)
WM_ACTIVATEAPP (00000000, 00000260)
WM_DESTROY (00000000, 00000000)
WM_NCDESTROY (00000000, 00000000)
Точками отмечены повторяющиеся сообщения WM_ENTERIDLE
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.063 c