PopupMenuを使用した時に、WM_INITMENUPOPUP の取得方法は?

解決


AE85  URL  2007-10-12 09:28:14  No: 28000

PopupMenuを使用した時に、WM_INITMENUPOPUP の取得

フォームにMainMenuを貼り付けた場合は、
WM_INITMENUPOPUPメッセージを取得出来たのですが
PopupMenuの場合は、何もメッセージが取得出来ませんでした。

PopupMenuを使用した時に、WM_INITMENUPOPUPを取得する方法は
どのようにすればいいのでしょうか?


それは  2007-10-12 18:35:44  No: 28001

VCLソースを見れば分かるけど、PopupMenuへのメッセージは Formではなく
TPUtilWindowクラスのWindowに送られるので、グローバルなメッセージフックを
するか、自前のPopupMenu派生クラスを作るしかないと思う。


AE85  2007-10-12 23:11:47  No: 28002

回答ありがとうございます。
フックを使って出来ました。

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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加