PopupMenuを使用した時に、WM_INITMENUPOPUP の取得
フォームにMainMenuを貼り付けた場合は、
WM_INITMENUPOPUPメッセージを取得出来たのですが
PopupMenuの場合は、何もメッセージが取得出来ませんでした。
PopupMenuを使用した時に、WM_INITMENUPOPUPを取得する方法は
どのようにすればいいのでしょうか?
VCLソースを見れば分かるけど、PopupMenuへのメッセージは Formではなく
TPUtilWindowクラスのWindowに送られるので、グローバルなメッセージフックを
するか、自前のPopupMenu派生クラスを作るしかないと思う。
回答ありがとうございます。
フックを使って出来ました。
function MsgProc(nCode: integer; wParam, lParam: LRESULT): LRESULT; stdcall;
var
cwp: PCWPStruct;
mnuItem :TMenuItem;
mnu: HMenu;
begin
if (nCode = HC_ACTION) then
begin
cwp := PCWPStruct(lParam);
case cwp^.message of
WM_INITMENUPOPUP:
begin
mnu := HMenu(cwp^.wParam);
mnuItem := nil;
if mnu <> 0 then begin
mnuItem := MainForm.PopupMenu1.FindItem(mnu, fkHandle);
end;
if Assigned(mnuItem) then
begin
s_DebugMsg(Format('mnuItem取得=%s',[mnuItem.caption]));
end;
s_DebugMsg('MsgProc:WM_INITMENUPOPUP');
end;
end;
end;
Result := CallNextHookEx(MainForm.m_HookHandle, nCode, wParam, lParam);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
m_HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, MsgProc,0,
GetCurrentThreadId());
s_DebugMsg(Format('m_HookHandle=%d',[m_HookHandle]));
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if m_HookHandle <> 0 then
UnhookWindowsHookEx(m_HookHandle);
end;
ツイート | ![]() |